{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Optional Lab: Gradient Descent for Linear Regression\n",
    "\n",
    "<figure>\n",
    "    <center> <img src=\"./images/C1_W1_L4_S1_Lecture_GD.png\"  style=\"width:800px;height:200px;\" ></center>\n",
    "</figure>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Goals\n",
    "In this lab, you will:\n",
    "- automate the process of optimizing $w$ and $b$ using gradient descent."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Tools\n",
    "In this lab, we will make use of: \n",
    "- NumPy, a popular library for scientific computing\n",
    "- Matplotlib, a popular library for plotting data\n",
    "- plotting routines in the lab_utils.py file in the local directory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math, copy\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use('./deeplearning.mplstyle')\n",
    "from lab_utils_uni import plt_house_x, plt_contour_wgrad, plt_divergence, plt_gradients"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2\"></a>\n",
    "# Problem Statement\n",
    "\n",
    "Let's use the same two data points as before - a house with 1000 square feet sold for \\\\$300,000 and a house with 2000 square feet sold for \\\\$500,000.\n",
    "\n",
    "| Size (1000 sqft)     | Price (1000s of dollars) |\n",
    "| ----------------| ------------------------ |\n",
    "| 1               | 300                      |\n",
    "| 2               | 500                      |\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load our data set\n",
    "x_train = np.array([1.0, 2.0])   #features\n",
    "y_train = np.array([300.0, 500.0])   #target value"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2.0.1\"></a>\n",
    "### Compute_Cost\n",
    "This was developed in the last lab. We'll need it again here."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Function to calculate the cost\n",
    "def compute_cost(x, y, w, b):\n",
    "   \n",
    "    m = x.shape[0] \n",
    "    cost = 0\n",
    "    \n",
    "    for i in range(m):\n",
    "        f_wb = w * x[i] + b\n",
    "        cost = cost + (f_wb - y[i])**2\n",
    "    total_cost = 1 / (2 * m) * cost\n",
    "\n",
    "    return total_cost"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2.1\"></a>\n",
    "## Gradient descent summary\n",
    "So far in this course, you have developed a linear model that predicts $f_{w,b}(x^{(i)})$:\n",
    "$$f_{w,b}(x^{(i)}) = wx^{(i)} + b \\tag{1}$$\n",
    "In linear regression, you utilize input training data to fit the parameters $w$,$b$ by minimizing a measure of the error between our predictions $f_{w,b}(x^{(i)})$ and the actual data $y^{(i)}$. The measure is called the $cost$, $J(w,b)$. In training you measure the cost over all of our training samples $x^{(i)},y^{(i)}$\n",
    "$$J(w,b) = \\frac{1}{2m} \\sum\\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)})^2\\tag{2}$$ "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "In lecture, *gradient descent* was described as:\n",
    "\n",
    "$$\\begin{align*} \\text{repeat}&\\text{ until convergence:} \\; \\lbrace \\newline\n",
    "\\;  w &= w -  \\alpha \\frac{\\partial J(w,b)}{\\partial w} \\tag{3}  \\; \\newline \n",
    " b &= b -  \\alpha \\frac{\\partial J(w,b)}{\\partial b}  \\newline \\rbrace\n",
    "\\end{align*}$$\n",
    "where, parameters $w$, $b$ are updated simultaneously.  \n",
    "The gradient is defined as:\n",
    "$$\n",
    "\\begin{align}\n",
    "\\frac{\\partial J(w,b)}{\\partial w}  &= \\frac{1}{m} \\sum\\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)} \\tag{4}\\\\\n",
    "  \\frac{\\partial J(w,b)}{\\partial b}  &= \\frac{1}{m} \\sum\\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)}) \\tag{5}\\\\\n",
    "\\end{align}\n",
    "$$\n",
    "\n",
    "Here *simultaniously* means that you calculate the partial derivatives for all the parameters before updating any of the parameters."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2.2\"></a>\n",
    "## Implement Gradient Descent\n",
    "You will implement gradient descent algorithm for one feature. You will need three functions. \n",
    "- `compute_gradient` implementing equation (4) and (5) above\n",
    "- `compute_cost` implementing equation (2) above (code from previous lab)\n",
    "- `gradient_descent`, utilizing compute_gradient and compute_cost\n",
    "\n",
    "Conventions:\n",
    "- The naming of python variables containing partial derivatives follows this pattern,$\\frac{\\partial J(w,b)}{\\partial b}$  will be `dj_db`.\n",
    "- w.r.t is With Respect To, as in partial derivative of $J(wb)$ With Respect To $b$.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2.3\"></a>\n",
    "### compute_gradient\n",
    "<a name='ex-01'></a>\n",
    "`compute_gradient`  implements (4) and (5) above and returns $\\frac{\\partial J(w,b)}{\\partial w}$,$\\frac{\\partial J(w,b)}{\\partial b}$. The embedded comments describe the operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_gradient(x, y, w, b): \n",
    "    \"\"\"\n",
    "    Computes the gradient for linear regression \n",
    "    Args:\n",
    "      x (ndarray (m,)): Data, m examples \n",
    "      y (ndarray (m,)): target values\n",
    "      w,b (scalar)    : model parameters  \n",
    "    Returns\n",
    "      dj_dw (scalar): The gradient of the cost w.r.t. the parameters w\n",
    "      dj_db (scalar): The gradient of the cost w.r.t. the parameter b     \n",
    "     \"\"\"\n",
    "    \n",
    "    # Number of training examples\n",
    "    m = x.shape[0]    \n",
    "    dj_dw = 0\n",
    "    dj_db = 0\n",
    "    \n",
    "    for i in range(m):  \n",
    "        f_wb = w * x[i] + b \n",
    "        dj_dw_i = (f_wb - y[i]) * x[i] \n",
    "        dj_db_i = f_wb - y[i] \n",
    "        dj_db += dj_db_i\n",
    "        dj_dw += dj_dw_i \n",
    "    dj_dw = dj_dw / m \n",
    "    dj_db = dj_db / m \n",
    "        \n",
    "    return dj_dw, dj_db"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<br/>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img align=\"left\" src=\"./images/C1_W1_Lab03_lecture_slopes.PNG\"   style=\"width:340px;\" > The lectures described how gradient descent utilizes the partial derivative of the cost with respect to a parameter at a point to update that parameter.   \n",
    "Let's use our `compute_gradient` function to find and plot some partial derivatives of our cost function relative to one of the parameters, $w_0$.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAtcAAAERCAYAAACw14tpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdZ2AU1drA8f+W9N4bKQQILQGllwRCEwSuUhUEBAtIUa+8iqIIiKiIiBevomABUQGVcgWVovQO0gIhdEhCGgnpPVvO+yESE0wDMruU8/sCOzM7zzPJ7pknM2fOUQkhBJIkSZIkSZIk3Ta1uROQJEmSJEmSpHuFLK4lSZIkSZIkqY7I4lqSJEmSJEmS6ogsriVJkiRJkiSpjsjiWpIkSZIkSZLqiCyuJUmSJEmSJKmOyOLazL744gtCQ0Oxs7MjMDCQZ599lqSkpFveX1BQEAcOHKjDDM0jPj4ed3f3stc3Htc333xDnz59zJFaBSkpKahUqrLXzZs3588//7ytfcbGxmJtba3Y9rdCpVKRkpJS5frIyEh++OGHW9r3rl276NKlC3Z2dpX+Tg8ePEhoaCi2trb07t2b1NTUsnUFBQUMHz4ce3t7goOD+fXXX28pB0m6E3z11Ve0bNkSW1tbfH196dOnD1u3bq2Tfd8JbVV5NbUppnLjucYUdu/eTevWrU0a80a1PYea4vxyL5LFtRm98847zJo1i/nz55ORkUF0dDQtW7Zkz5495k7N7AICArh27ZrJ4+p0utt6/6lTp2jbtm0dZXN/sLW1Zfz48bz++uv/WFdUVMSgQYOYOnUq6enp1K9fnwkTJpStf/PNNykoKCAlJYXFixczcuRIrl69asr0JalOzJ49m7feeov333+f9PR04uLiePnll9m0aVOl28u2qm6Y41wTERHBkSNH6nSft/t5kOqYkMwiMzNT2NjYiHXr1lW5TVRUlOjYsaNwcnISHTt2FFFRUUIIIQwGg5g4caJwc3MTjo6Oon379qKkpEQ888wzQqVSCRsbG2FnZydWr15dYX+7du0SjRo1qrDslVdeES+//LIQQohZs2YJLy8v4eDgIFq2bCmSkpL+kdOwYcPEkiVLhBBCbN68WQDixIkTQggh3n//ffHiiy9We9x5eXnCzs5OFBYWCiGEGD58uGjVqlXZ+iZNmoijR4+Ky5cvCysrKyGEqPS4li5dKnr16iXGjx8vHBwcRLNmzcSxY8eqjDtz5kzh7u4uGjVqJObNmycCAwOFEKIszqeffip8fHzEs88+K65duyZ69+4t3NzchIeHh5g4caIoKSkp29fixYuFj4+P8PPzEx9//LEo/zUKDAwU+/fvF0IIUVBQICZNmlS27fvvv1+23ejRo8XkyZNF9+7dhb29vejdu7fIyMgQQgjRqFEjAQg7OzthZ2cnrl69Knbv3i3CwsIqPbbrx/Dxxx8LNzc3ERQUVOXnKiUlRfTq1Us4OjoKV1dXMWnSpLJ1O3bsEK1atRJOTk6ia9eu4sKFC0IIIXr16iUAYWtrK+zs7MShQ4cq7PPtt98WarVaWFlZCTs7OzF//nwhhBA//vijaNSokXB1dRVDhw4V6enpVf5+hBBi6dKlonfv3hWWbdy4UTRt2rTsdWJiorC0tBS5ublCCCG8vLzEwYMHy9b37t1bLFq0qNo4knSnycjIENbW1mL9+vVVbnO3tFXlVXWuEkIIQCxevFgEBgYKNzc3MXfu3LL3FRQUiHHjxgkPDw8RFBQkFixYIISo/flj+/btonHjxuKtt94SLi4uIigoSPzxxx/V/lyvqy6vG+3fv180a9ZMODo6ildffVU0btxYbN++XQghRNeuXcXKlSvLtp05c6Z47rnnhBCiLD8hhHj66afFu+++W+Fn5uXlJU6ePCmEqLpdruzzcKOuXbuK6dOni9DQUOHi4iImTJggdDqdEOKf7W1V7XVNv2OpcrK4NpMNGzYIrVYr9Hp9peuLi4tFYGCgWLx4sSgpKRGfffaZCAwMFMXFxWLjxo2iTZs2IicnR+j1erF///6y/ZRvMG9kNBqFr69vhSI0KChIHDx4UJw+fVr4+/uLq1evCoPBIKKiokRWVtY/9vHpp5+Kp556SgghxPTp00VQUJBYuHChEEKI/v37i1WrVtV47G3atBE7d+4UQghRv359ERQUJHJyckRaWppwcnISer3+Hw3ejce1dOlSodVqxapVq4RerxfTpk0T3bt3rzTe+vXrRVBQkLh8+bJIS0sT7du3r1Bcq1QqMX78eFFYWCgKCgpEamqq+OWXX0RRUZFISEgQoaGh4vPPPxdCCHHixAnh5OQkjhw5InJzc0Xfvn2rPGFNnDhRjBw5UuTm5oqkpCTRrFmzspPn6NGjha+vrzh58qQoLCwU3bt3F2+//XZZTuWPvSbXj2HcuHGisLBQbNy4Udjb24vU1NR/bPvaa6+JiRMnCp1OJwoKCsSBAweEEELEx8cLDw8PsXv3bqHX68Unn3wiWrduLYxGoxCi9ISTnJxcZQ43nkhiYmKEs7OzOHjwoCgoKBAjR44Uw4cPr/Y4Kiuu58+fL4YOHVphmbu7uzh69KhIT08XgMjPzy9b98orr9T4B54k3WlqOh8IcXe2VdWdqwAxfPhwkZeXJ06ePClsbGxEbGysEEKIqVOnil69eons7Gxx9uxZ4evrKzZv3iyEqN35Y/v27UKj0Yj58+cLnU4nvvjiCxEcHFzlz/XG4rqqvMorLi4Wvr6+YsmSJaK4uFjMmDFDaDSamy6uN23aJFq2bFm23bZt28ouKFTXLlf2ebhR165dRXBwsLh48aJITU0VLVu2FJ9++qkQomJ7W117fbPnI6mU7BZiJunp6bi7u6PRaCpdf+DAAbRaLePGjcPCwoIJEyag0Wg4cOAAFhYW5Obmcu7cOdRqNR06dKhyP+WpVCqGDBnCTz/9BJT2ZQVo164dWq2W4uJiTp8+jRCCFi1a4OTk9I99hIeHs3v3bgD27NnDlClT2L17N0II9u7dS3h4eI15XN/HlStXcHV1pVu3buzbt489e/bU+lgAwsLCGDJkCBqNhieeeIKoqKhKt1uzZg1jx44lKCgId3d3XnzxxQrrhRDMmjULa2trbGxs8PDwoH///lhZWeHn58ezzz5b1lVnzZo1DB06lFatWmFvb8/UqVMrjSmEYOnSpcyfPx97e3t8fHyYMGECq1evLtvm8ccfJzQ0FGtrawYPHlxl/rUhhGDGjBlYW1vTp08f2rVrx4YNG/6xnYWFBcnJySQmJmJjY0P79u0BWL58OUOGDCE8PByNRsPzzz9PXFwcsbGxt5TPqlWrGDx4MO3atcPGxoZ3332X1atXYzAYbmo/+fn5ODo6Vljm6OhIXl4e+fn5aDQabG1t/7FOku4mlZ0PvL29cXJywtnZuWzZ3dZW1XSumjp1KnZ2doSGhhIaGsrJkycB+PHHH5kxYwaOjo6EhITw3HPPlT3TUdvzh5OTE5MnT0ar1TJixAguXbpU67ahqrzK27dvH7a2tjz11FNYWlryxhtvYGVlVav9l9ejRw8SEhI4d+4cAD/99BOPPfYYUHO7fOPnoTJPP/00wcHBeHh48PLLL1f4vV5XV+219DdZXJuJm5sb165dq/LDm5SUhL+/f4VlAQEBJCcn06NHD8aOHcvo0aPx8/PjrbfeqnXcxx9/nFWrVgEVv8QNGzbkgw8+YMqUKXh5efHiiy9SXFz8j/eHhYWRlpbGlStXOH/+PGPGjOHQoUNER0fj5uaGt7d3jTlcbxx3795NeHh4hdcRERG1PhZPT8+y/9va2lbZcKakpFCvXr2y135+fhXWW1paVthXbm4uTz75JH5+fjg6OvL666+Tnp5etq/yv5eAgIBKY6alpVFYWEhISAjOzs44OzvzxhtvVHgYr7b514ZarcbX17dCXsnJyf/YbsqUKfj5+dGpUydCQ0NZs2YNUPpQz9KlS8tydXZ2Jj8//5Yfrr3x8+vv74/BYLjpvo12dnbk5uZWWJaTk4O9vT12dnYYDAYKCwv/sU6S7iaVnQ9SUlKIioqiqKiobNnd1lbVdK6qar83th+BgYFl7Vltzx8eHh5lD3Be/wO8tnnX5nhv/PlaWVlVeF9tabVaBg0axE8//YTBYGDt2rVl5+Wa2uUbPw+VufEzUNl5oa7aa+lvsrg2k44dO6LVaiu9ugjg6+tLQkJChWXx8fH4+PgA8PLLLxMdHc2uXbv4+uuv+eOPPwAqPA1eVdzi4mKOHj3K6tWry77EAKNHj+bQoUOcPHmSPXv28O233/7j/Wq1mo4dO/LJJ5/wwAMPYGtri5eXF999912trlpD6cMc+/fvZ+fOnURERBAeHs6ePXvYs2dPlfuo6biq4+3tTWJiYtnr8v+vbN8fffQRGRkZnDhxgpycHObMmYMQomxf5X8vV65cqTSmu7s71tbWxMXFkZWVRVZWFjk5OWzcuLHGfG/lWI1GY4VG88qVK5X+oePo6Mgnn3xCYmIi8+fP54knniAvLw8/Pz/Gjx9flmtWVhYFBQV07ty5VvFvzNnX17fCzyYhIQGNRnPTT+U3a9aM6OjostfJycnk5OTQqFEjXF1d8fLyqrA+OjqaZs2a3VQMSTK3Dh06VHs+uO5ubKuqOldV58b2o/y571bOH0q48edbUlJS4Q8SOzs7CgoKyl5X96D1Y489xqpVq9i5cyeenp5lbVhN7XJtfv43fgYqOy9U117fzrn3fiaLazNxdnZm2rRpTJw4kT/++IOSkhLy8/P5/PPP+emnn+jQoQMlJSV89dVX6PV6Fi9ejF6vp0OHDhw+fJgjR45gMBhwdHREq9WW3Qrz9PTk0qVLVca93jVkypQpWFhYlA0HdPbsWXbt2kVJSQn29vZYWVlV2T0jPDycRYsWlV0luPE1wFtvvcWYMWMqfb+npyeenp6sXLmS8PBwQkJCuHz5MqdOnaJdu3ZVvqe646rOoEGD+PLLL4mLiyM9PZ1PP/202u1zc3OxtbXFycmJy5cv88UXX5StGzhwIKtWreL48ePk5eUxd+7cSvehVqsZNWoUkydPJisrC6PRyOnTpzl06FCN+bq7u1NSUlLhqvGOHTsICgqq8j0qlYrZs2dTXFzMH3/8wYEDB+jbt+8/ttuwYUPZLUUXFxdUKhUajYbhw4fz448/smvXLoxGI7m5uRVuH9b0879x/eDBg1mzZg2HDx+mqKiI6dOnM2jQoEo/U0ajkaKiInQ6XYX/Q+kQf5mZmaxYsYLCwkLefvtt+vfvX3Z1+oknnuDdd98lLy+PLVu2sH//fgYMGFBlnpJ0J3JxceGNN95gwoQJbNiwgcLCQkpKSmocVvVObKvKq+5cVZ2hQ4fyzjvvkJOTw/nz51m8eHHZhaBbOX8ooWPHjuTl5bFs2TJ0Oh1z5sypcLe3ZcuWrF69muLiYo4fP15pd4zrunXrRnJyMu+8806FC141tcu1sWTJEmJjY0lLS+Ojjz5i8ODB/9imuva6pt+xVDlZXJvRm2++yZtvvslLL72Ei4sLTZs25dixY0RERGBpacm6dev46quvcHNzY+nSpaxbtw5LS0uys7MZPXo0Tk5OtGjRguHDh9O9e3cAXnnlFaZMmYKzszNr166tNO7jjz/Otm3bGDp0aNmy4uJi/u///g83Nzfq169PaGgoo0aNqvT9ERER5Obmll0lCA8Pr/AaSq8OVzfMU0REBN7e3nh5eQHQunVrWrRoUWW/sdocV1UeeeQRRo4cSevWrWnfvj39+vWrtm/cv//9b65cuYKzszPDhg1j4MCBZetatmzJe++9x8MPP0yTJk3o1atXlftZsGABjo6OhIWF4erqypNPPklmZmaN+drZ2TFlyhRatGiBs7MzqampNf48LS0tadq0KX5+fowdO5bvvvuu0tuFZ86coUuXLtjb2zNixAiWLVuGjY0NwcHBrFy5kldffRVXV1eaNGnCzz//XPa+adOmMXDgQJydnTl8+PA/9jtp0iS++uornJ2dWbBgAc2bN+ezzz5j+PDh+Pr6kpeXV+UfNbt27cLGxoZx48bxxx9/YGNjw9ixYwGwtrZm7dq1vPvuu7i5uXHx4kU+++yzsvfOnj0ba2trvLy8yo77+mdKku4m06dP56233uL111/Hzc2NoKAgli5dWu3Y7XdiW1Vedeeq6sycORN/f38aNmxIz549efnllyuMyXyz5w8lWFlZsXr1aubOnYu7uzsFBQU0bNiwbP3kyZMpKirC3d2dV199lWHDhlW5L41Gw+DBg9m+fXuF4rqmdrk2hg8fzr/+9S9CQkJo164d48eP/8c21bXXNf2O71czZ85k8eLFVa5Xiev3kCSpDoWHh7N582bs7OzMnco/fPvtt3zzzTds27bN3KnU2sSJExk1ahQdO3Y0dyqSJElSJZo0acKiRYuIjIw0dypA6Z2/8ePHV1vYS7fmkUceITg4mAULFlS6XmvifKT7xJ02Ec66devo168fSUlJfPjhhzzzzDPmTummlL9aK0mSJEmS+axfv77a9bJbiHRf+Oijj3BxcaFdu3ZERkZWmOVPkiRJkiSprshuIZIkSZIkSZJUR+SVa0mSJEmSJEmqI/dEn+vs7GxzpyBJklQnKpsZ9V4k221Jku4FlbXZ8sq1JEmSJEmSJNURWVxLkiRJkiRJUh25J7qFlHe/3FKVJOnecb93kZDttiTVTAjBp/sOsnDfQfRGY4V1A5o3ZV6/3opPV24URlbFHuU/MVvI0RXhZ+vMmy36Eu7VkH9tXci34U/hbm2vSOwSQxFbU9ewM/UXjBgItA1hYL1n8bWpr0i88vSGJLKy36Kw8BcAHO3PVLv9PVdcS5IkSZIkKSUnv4jDp+M5cCqObq0b0TE0yCRxVSoVQ1uEsjc2jsMJf09H3jkogPce7qV4YR2TlczbUb9yIjMRrUrNuJAInguJwEZrCcDSzqMVK6xPZf/JusQlZOmuYaux52GfkbR17YZapWwHDCF05OV9TXbuhwiRj1bbABenOZSb6b5SsriWJEmSJEmqgt5gJOZyCgeiYzlwKo5Tl1IwCsGYfu1MVljrjUa+P3qc/+zeR36JDiuthmK9gaaeHiwc8C8sNRrFYufpivjk9HaWXzqEEUF79yDebNmPBg4eFbbzsnGs89gZJamsS1zC6ZwjALR17UZfn5HYaes+1o2Kiw+SmTUVnf4MKpU1To6v42D/HCqVFcXF1d9tlMW1JEmSJEnSDbLzCpm3Yjv7Tlwmt6DipcreHZowYWBnk+QRlZTC9N+3EnM1FSuthv/r0hk/Rwc+2rWPr4cOwN7KUpG4Qgg2JZ1i7snNpBbl4mZlx6uhvelfL0zxq+R6o45dab+w9eoadKIEb+sABtUbS5BdE0XjAhgM18jKeYeCgh8BsLbujYvTbLRa/1rvQxbXkiRJkiTd0Qryizl28BJNwvxw81D+qiWAk70NT/Vrx4GTsRWWt25SjxlPPYRarWyBmVNUxPxd+1hxLAoBdKkfxFsPdSPA2ZkzqWl8PXQAnvbKdMOIy0vnnRMb2Jt6ERUwvH5bXmzaHSdLG0XilXch9yQ/J35NanEilmpr+vuMprP7w2hUyl2dBxDCSH7B92Rnz8EostBo6uHi9A42Nr1vel+KdVaJjY3Fy8uLyMhIHnroIQDmzZtHeHg4I0aMQKfTAbB8+XI6depE//79ycnJAWDbtm107NiRbt26kZCQAEB0dDTh4eF07tyZEydOKJW2JEmSVI2DBw/SqVMnIiIimDx5MlD7tl26effzJMopSZms++EAb0z6lsd6zCXmRLzJCmuA6IvJTF+8gez8orJl9X3d+GDSI1haKHdtUgjBLzFneOirZSw/FoWnvR2fPNqPr4cOIMDZGYAmnh40dHer89jFBh0Lz+zg0W2fsTf1Is2cfPih61imt+yneGGdq8tkRdzHfHHpbVKLE2nh1JFXGi+gi0d/xQvrkpIoUtP6k5n1GkaRj4P9i3h77rylwhoUnP48NjaWN998k++//x6AtLQ0Ro8ezYYNG5g7dy7BwcEMGDCA7t27s337dtasWUN8fDxTpkyhW7durF+/npiYGL799lsWLlzIwIED+e9//4tarWbixImsW7euLFb5J+3lU+eSJN1t7qY2LCUlBWdnZ6ytrRkxYgTjx49nzpw5tWrby7uVYxZCKH47+k6KrdcbWLzgdya98rBJ45ZXVFCMlY2lyY/98vmrvPXySlISMwHo0LUxM+YNQ6NRfgThvIJiPlu7h9XboxACwlvUp6hEz+XkDJZOG46Pu3IFfmxGJjN/38beuHjUKhWjWrXkpYhOOFhZKRbzun2pF3k76jfi8zOw11rx72bdGVa/LRqFHxo0CgP7039nc/JKioyFuFl6M8DvGRo7PqBoXACjMYfsnLnk5X8DGLGyisDF6V0sLBpV+76a2i9Ff2Lbt28nIiKC//znPxw6dIjIyEgAevbsyYEDBzh37hxhYWFotdqyZQUFBdjY2ODg4ED79u2JiYkBICMjA39/f/z8/Ops2Ko8HexNrpNdSZIksTe5tF25l3l7e2NtbQ2AVqvlxIkTtWrbb9expCQGrVjB/vj4295XTa5l51Os0wNgNAp+2XeKx2d9R1ZeoeKxrzPojXww62c2rD/Kgvd/NcsV7JTYVAY4j2br8t0mj12/kRc+9VzK/j/1ncEmKawBCot1bNh/GjdHO+ZO7M9H/x5Ay0a+LHhpgKKFNcDlzEz2xsUT5u3F2ieHM71nN5MU1gC7r14gPj+DfvVC+a3n84wIbq94YX3d4Ywd6IWeXl6P8X+N55uksAYwijzyC35ArXbHzeVzPNx+rLGwrg3F7mv4+Phw7tw5rKysePTRR8nJycHLywsorfIzMzPJysrC0dGxwrLMzMyyZQAGgwEAY7kxHY03jO94qzKL4ZGNkDQarJS94yBJ0j2uxACPboIjQ8DewtzZKO/EiRNcu3YNZ2dnNH+NVFBd236rUvPy+GDPHv7314WWjefP0zEg4PYPoArZ+UVMWrCWT14cSEpGDh/+uINTsVdRq1QcOh3PQ20bKxb7OoPByIfvrGPHH6cA2LfzLGOf74mdvbXiscvzqOfGsKkDCA1X/iGyyrwxZyiL529i9ITu2NiapsAE8HCx56MXBxDi74H9X3Gf7t9e0a4g13VrEMyXQx6lS/0gNGrTzvP3fJNIung3oqNHsEnjqlUaHg94Hq1Ki7uVj0ljazW+uLt9i6VFGGp13f3hpNgnxcrKCqu//trq378/jo6OJCYmApCTk4OzszPOzs5lffGuL3NxcanQP0/914dLXe5Dpq6jD5y/PbRwgw1xMNC0nyVJku4xG+OhuQsEOpg7E+VlZGTw/PPP89NPP3HkyJFate03q1iv55tjx1h44AD5Oh31HB15o2tXHmrYsE6Ppbz8ohJe+Ph/XEi8xsylmzh05goAbZv48/JjXWlUz6OGPdw+o1GwYM6vbN10smyZja0lB/acp0efMMXjl6fRahjz9jCTxizP0cmWF17vj7WNMqNhVKdV43oVXpuisL6uWwPzFCR2FlYmL6yv87au/Ugcdc3aqu5HfVHs05Kbm4uDQ+lZZu/evbzwwgusWLGCV199lS1bttChQwdCQkKIjo7GYDCULbO1taWwsJC8vDxiYmJo1qwZAK6uriQkJKBWq+u0T+KIRrD8vCyuJUm6PcvPw4gQc2ehPL1ez8iRI5k3bx7e3t60bduWzz77rMa2vTo6gwGLcuP0br90idk7dhCXlYW1VstLnToxtnVrrC2UuyVQVKJn8qfrOBWbAsChM1fwc3di8tAuRD7QwCR9jo1GwZLPtpKWmsMTT0XQNNSPxs38cHaxUzz2ncochbUk3S7Fiuvdu3czffp0rKysCA8Pp3379nTp0oXw8HACAgJ46aWXsLCwYOzYsURERODi4sKKFSsAmDZtGr169cLa2pply5YBMGvWLIYNG4YQgoULF9ZZnkMawMv7IasYnE1310mSpHtIdjFsvgKLu5o7E+WtWrWKP//8k9deew2AOXPm1Lptr8rsHTt4u0cPLmVk8M6OHeyMjQWgf+PGvNalC74Oyt4O0OkNvLb4V46cS6iwvE3jerRrGmCyh/mEEDw9sYfiQ7xJkqQsxUYLMaXbfdJ+8CboGwjPNK3LrCRJul8sPQPrY+F/fW7t/XfTaCF1pfwxP/7zz3QNCuKbY8fQG4009fBgRrdutKtXr5o91A2D0ci0rzbyx+FzZcvUKhWNAzx4oKEfD7UJoUUDX8XzkCTp7lFTmy0nkaH0Vu4nJ2VxLUnSrfn+HExobu4s7l7n09M5n56Oi7U1/9e5M4+HhZnkYS6jUfDud1vYfeIS7Zr480BDPx5o6EtosA921rI7giRJt0YW10DfABi7A67klT7kKEmSVFuJeXDsGvQPNHcmdzcbrZbvhg6lqYfyDw1el56Tz5CuLXh9RA8stHLIKEm61wghSC5KJTr7DG5WLrR2aWGSuLK4Bqy1MCgYVp6HVx80dzaSJN1NfrgAA+uXtiPSrdMZjczZuZOPHn4YdzvTPMDn4WyPh7O8oiJJ95JrxRmcyj7LyewznMo5S0ZJFq2cw3ilyXiT5SBPB38ZGQIv7pHFtSRJN+f78/BRJ3NncXf7dsgQHvTxwVbB0UAkSbp35esL+CF+HSeyY0gpSquwrpF9fV4KGav4FOrlmXaE8jtYhE/ppDIn082diSRJd4tTGZBWCF3l8263pXNAgCysJekeIYTgck4Gyfk5NW9cR+y0tkR6diJPX1Bhua+NN681mYSVxrTPUMgr139Rq+CJv8a8ft/N3NlIknQ3WH6utN2QI6dJknQ/SynIZV9yHHtTYtmfHE9TVw8WRw42Wfz4/ES+jV1Fnj6/bJmLhRPTmr6Ig4Xpu37J4rqcEY2g3wZ4r708WUqSVD2jgBUXYN0tDr8nSZJ0t8oqLmR/Shz7UuLZmxzLpZyMsnWtPPz4tMsAtCYY8afQUMSqK7+yMXkbRow0dmiAzqgnpSiVN5q+iLuVq+I5VEYW1+WEuYGLFexOlrd5JUmq3t5kcLCAFvJOlyRJZiaEQAhMNgFRRnEh3549yv6U+ArLGzi58XW3IdholRCuLnYAACAASURBVO3mJYTgQPoRlsWuIlOXjaPWgRGBA+ni0YFvY1cxKmgIAXZ+isQ2ipIat5HF9Q1GNCods1YW15IkVWf5+dL2wkST90mSJFWQlpvPgYvxHLh0BTsrC17t0xU1pmmQXCxtCLR3YT9/F9deNvZ82+MxXKxtFI2dVJjCkss/cDL7DCpU9PLqwrCAR7HXlo4y9HjAo9horBWJnV64lzPp7xDq8EO128ni+gbDG0HLn+CTcDm0liRJlSsxwOpLcGSIuTORJOl+kVdUzJ+xCRy4eIX9F+O5kFo6AsODAT58NWYwWo0JJl4SglUXTvD+0R1kFhfibetASkEuDhZWLOv5GH72ys0wW2wo4X+JG1if9AcGYSDYLpBngofT0D6ownZKFNZF+hTOZczlav6mWm0vy8cb+NtDSzf4LQ4GNzB3NpIk3Yk2xEMzFwh0MHcmkiTd64QQLNlzhAV/7MFgFBXWBXu4snDkAGwslR9tJybjKm8e/J2jaYloVWqea96eF1t0JmLt53weOZAmLp6KxT6cEcU3sT+SVpyBncaW4QED6OEVjlql7B8URqEjPvtbLmV9hkEUYGtRnyZub0INPUNkcV2JJxvDsrOyuJYkqXLLzsLoxubOQpIkU8vMyufwyXhsrC0Jb2uaIkGlUjGmcyuOxyex9fTFsuWeDnYsfnIgzrbKdIG4LrekmI+idrPszBGMQtDOsx6z2/emsUvpbKpfdhtMa896isS+WpTGN7E/cTTzJACRHp0YETgQRwvlr2xkFB7iTPrb5OsuolZZ09BlMoFOY1CrLMkuya72vbK4rsSQYJi8F64WgJetubORJOlOklYI2xNhWXdzZyJJktKKi3VEnU7kz6hYDp+I5/zlVMIa+7LgraEmy+FEQgqz1m3ldHJq2TJ7K0sWjx6In4ujYnGFEPwSe5p3Dm8jtTAPd2tb3mjdnYHBzVGVe9hEicK6xKjjl6Tf+V/CJnRCR4CtH8/UH04Tx4Z1HutGxfo0zmXMIyX/FwA8bHvQ2PV1bCxq/4CkLK4r4WAJjwTBivMwuaW5s5Ek6U6y8jz0DwRH085JIEmSiRQUlrBm4zEOn4jj5OlESnSGsnUBfq68/8ZArKyU74aRXVjEf37fw6rDJxECwhsFEhFSnw837ebTEY/Q2NtDsdgXstOZcfB39qXEoQJGNW7FKw90wclK2avkAMezTrH08g+kFKVho7FmuP8A+nhHKj7DolHoSchZycXM/6IXedho/WnsNg0P2643vS9ZXFdhTGP4v32yuJYkqaJlZ2FuR3NnId0P9AYjsXHXaBisXF/Wu0FOZj4lxTrcvZ1NEs/WxpImwV6s/vVohcLa1dmWD98chJODsqNhCCFYf/w08zbtIiO/EE8HO17vF8lDzRtxOjmV94f0pl2wvyKxC/U6Pj25jy9OHURnNNLSzYfZ7R+ihbuPIvHKu1acwbexqziYcQyAzm5tGRk0GFdL5X/vWUXHOJM+m9yS06hVlgQ7TyLI6Vk06lv7Y0IW11WI9CudDv34NXjA3dzZSJJ0JziZDqmF0E0O1WkWRiFQm2nsQ6NRmGwM4evx5n+8GU8PB+oHuqMxwUgQlRFCVOgCYColxXp+XrqTg1tjEEbBe9+PN1nsnLwitu07S3rW37P92VhbMG/aYHy9lC30LqamM2v9Vg7HJqJRqxjduRXPd++InVXprbKmPp408/VSJPbWhAvMOPg7ifk5OFpaMfPBSIY3aolG4clgDMLAb0lbWZ3wG8XGYnxtvHmm/jBCnZooGhegxJDJ+YwPScpbC4CbTQRN3N7E1iLgtvZrnm/rXUCtglEhpVepJEmSoLQ9GBUCZqpz7hhJSUm0atUKa2tr9Ho9AE5OTkRGRhIZGUlGRulsbcuXL6dTp07079+fnJyc24p5KDmBvmuXsSvh8m3nfzMMRiNrDp7kkQ++ISOvwCQxhRB89uU2Nv5xks1bTzFl2k8IIWp+Yx07sPkEvy7dafK4AJZWWq5cSCUtKZM3F43B2sZ0/bAMegM7DpzH092Bxg280GjUvDPlERo3UKaoLS8lO4/DsYk84O/DqgkjeO3hrmWFNaDoHzpHUhNJzM9hSIMwtj06jpGNH1S8sAZQoeLPjOOAYHjAAOa1eNMkhTWAEDpS83/HWuNDS89PeNBr8W0X1gAqYY5vbB3Lzv77qU0np7obY/F8FoT/DAmjwELZrj6SJN3h9Ebw/w52PAKNXep230q1YUopKiqisLCQgQMHsmXLFrRaLeHh4ezZs6dsG51OR/fu3dm+fTtr1qwhPj6eKVOmlK2v7TGn5Ocy5+BO1l08DcCY5q14q1MPBY4KSvR6VKiw0JY2+FFxybz3v23EJKSiVat5f8TD9G4Zokjs8pYt38vS7/eWvXZ0tGHRglH4+pimWwRA9MEL/PTfzbTt0Zz+T3U109VrHYmX0qjf1PS3iqLPJhEc4M53aw7i7+tC3+6hJou9/2I87ev7m/ROCUCBroSYzFTaKDTyR3WSClOwUFvgYWX6KW+zio7iYNkEjbr2I1jU1H7JbiHVaOQMDZ1gYzw8Ut/c2UiSZE6br0CQQ90X1ncja2trrK0r9kU8ffo0ERERdO7cmTlz5nDu3DnCwsLQarX07NmTcePG3VSMEoOBJdGH+e/R/RTodQQ6OjOjQ3d6BCoz/JneYOS15Rt55V9dsNJq+c+GPaw/HANAh0YBTH00kgbeyp/4V/98uEJhDaBWqTh7PgUfbyeTFbmh7RsSulz5kRmqY2llYZbCGiC0cWncx/q3wsXZzqSxOza4/Sunt8LWwtIshTWAr423WeICOFu3qvN9yuK6BmP+GvNaFteSdH9bdra0PZAqd/78eVxcXBg/fjy//PILbm5uODqWDhPm5OREZmZmrfe188plZu3fyqXsTKw1Wqa0ieCZsDZYa5U5ZQkhmL1mK1tOXsDFzoYNx86SX1yCr4sjUx7pQo/QhiYpajf+fpJPF28re21hoaFpYx9aNK+Hra0lBqNAqzFPn/P7lakLa+neIIvrGjzWAF7ZD+lF4Kb8CDSSJN2BMorg9yvwxc2PyHTfcHV1BWDAgAEcO3aMRx99tKyfdU5ODs7ONXdpuJKTxdsHtvNH3AUA+tVvzBsdIvGzV24sX4D//LabtYeiAVh14CRWWg0TH+rIU93aYG1hmtPkzj1n+ezL7bRrU5+Wof6ENa9H4xBvrCzlaVqS7jbyW1sDJyvoG1A6tu3zYebORpIkc/jxAvT2B2crc2dyZ8rPz8fa2hqNRsPevXsJCwsjJCSE6OhoDAYDW7ZsoUOHDlW+v1Cv4/OogyyKOkSJwUAjZzdmdepBJ79AxXP/etufLN1xpMKyQe3DGNujHVoTPbkqhCDQ342ff3jebKOCSJJUd+S3uBbGNIZv5KghknTf+kZ2CalAp9PRs2dPoqKi6N27N9HR0bRt25aIiAiuXLnCkCFDsLCwYOzYsURERLBs2TKee+65KvfXc9US/nt0P1ZqDdM7dGPD4NEmKaxXHTjBgg17KiyzttBy6Wo6u06bblQSlUpFkBmH25MkqW7J0UJqwWCEgO/h9/7Q3LXOdy9J0h3sTCZ0Xw/xo0CrUO1zt40WUhfKH3PLn75gSEgor7Xtgoetafq4bo46x5Tvf8PG0oIHg3xpHVyPNsF+hPp7l40WIkmSVBk5Wkgd0Kj/HvP6AzkzmyTdV5adhZEhyhXWEnzfdyjhfkEmi5eVX8i1nHyWvzCcpn6eJuv+IUmS6QghiC9I41pxDq1dTTvyjSyua2l049KrV++1lydZSbpfGIzw3TnY3N/cmdzbZu7byrI+Q6jnYJqr9s52NoyIeNAksSRJMg0hBEmFGRzNvMiRjIsczbiISqVicduJJs9FFte11NSldIzbjfHwryBzZyNJkilsvgJ+drI7mNI2DBqNlUaejiRJujlFhhK2Xz1ZVlBfLcoqW+egteGztuPxtjH95ATyGuxNeLYpfHXa3FlIkmQqX50u/d5LypKFtSTdG4QQ5JeUmCyeldoCC7WGfWlnKhTWlmotcx8YTbC9eSankcX1TXi8IexKgqR8c2ciSZLSUgpgeyIMM+8kdZIkSXe0hJwcfjodzf9t2cigNSvJKi4yWexio45LeVfJ1/8dU6NSM7vFCFq6mG/2P3m54CbYW8CQBqUPOL1e97NlSpJ0B/n2LAwKBgdLc2ciSZJ057ian8f+hCvsT4xnX+IVruSUjpzhaGXF6oHD8HNQdtInKL1CvicthgVnfyGlKBN7rTXeli5cKbjGq00HEe7RTLHYBqGrcRtZXN+kZ5vCiC0w9UEwwWy4kiSZgRDw9WlY2t3cmUiSJN05zqZfY+yGn4nPya6w3EqjZUm/gYS4uSueQ0JBOgvOrmf/tTMA9PVtzYSGD/N97A5cLO3p79dWudj5R9md+l/6un5c7XaKdwv56KOPCA8PB2DevHmEh4czYsQIdLrSyn/58uV06tSJ/v37l02Vu23bNjp27Ei3bt1ISEgAIDo6mvDwcDp37syJEyeUTrtK7TzBRgs7k8yWgiRJCtuTXDoEZ0cvc2ciSZL0T1czc/nlUAwLf9tHYUnNV1LrSoirGxNbt6uwTKNSsbB3f9r4+Ckau9ig46uLvzNq/0fsv3aGhvY+fN52AtOaP4arlQMD63VkZFCkIrHzdGn8nvQ26xNeJrMkrsbtFb1yXVxcTFRUFABpaWls376dPXv2MHfuXH7++WcGDBjAokWL2LVrF2vWrGHx4sVMmTKF2bNn8/vvvxMTE8OcOXNYuHAh06dPZ+XKlajVaiZOnMi6deuUTL1KKhU806T0QadIZT9HkiSZyfUHGeXdKUmS7gTpOfn8eSGBQ+eu8Of5K8SnZeFoa8XSfz+GjaWFSXI4m36N6bu2cigpAbVKhfGvOQjndHuInvUbKBp7T1oMC86sJ7koEzutFRMb9WVgvQ5o1X9P+ORvV/dXzQ1Cz4nMNRy+tgydKMTJoh4RXi+Avvr3KVpcf/XVV4wePZoZM2Zw6NAhIiMjAejZsycrVqygWbNmhIWFodVq6dmzJ+PGjaOgoAAbGxscHBxo3749U6dOBSAjIwN/f3+g4sw45jAyBN46DJnF4GJl1lQkSapjWcWwLhY+7GTuTCRJut/9b3803+04ysXk9ArLrS20fDJuAA19lO+GkVtSzMeH9rP0xFEMQtDK24fZXXoy5te1PN2yFY81DVUsdkJBOh+fXc++v7qA9PFpxaRGfXG1clAs5nWJBcfYdfVjMkvi0KqsaO/+DA+4PIZGbVljHapYca3T6di5cyeTJk1ixowZZGVl4ehY2sndycmJzMzMSpdlZmaWLQMwGAwAGI3GsmXl/28O7jbQJwCWn4Pnw8yaiiRJdWzleehVDzxszJ2JJEl3kmvXcklKyqJFC3+TxezfrimHLyRUKK41ahUfPNWPB4J9FY0thGD9+TO8u3cnqQX5uFrbMLVTF4Y0aY5apeLl9p14vKkyRVCxQcf3sTv4PnYHJUY9Dey9+b8mA3jABCOA5OuvsS/1c87nbgOgvn0E4Z4TcbCo/bB+ihXX3333HU888UTZa2dnZxITEwHIycnB2dkZZ2fnsn7W15e5uLiULQNQq9UV/r3x/+bybFN4ZR9MCpW3jiXpXvL1GXi3Xc3bSZJ0b8vOLiDqeDzHjsVx/FgcmVn5fPzfUSaLn5VfyCe/7uW3wxUn2Jg5vBddQ4MVjX0+I50Zu7ayP/EKKmBUaEteaR+Ok7V12TbDmrVQJPbetNMsOLuepMIM7LRWTGj0MIPqdazQBUQJBqHnZOZa/rz2zV9dQPwI93yBQPv2N70vxYrrs2fPcvz4cRYtWsSpU6c4fPgwhw4d4tVXX2XLli106NCBkJAQoqOjMRgMZctsbW0pLCwkLy+PmJgYmjUrHU7F1dWVhIQE1Go1Tk6mmSK3Ot39ILsEjl6D1h7mzkaSpLpwLA3SCqFnPXNnIkmSORiNgpUr9rFr51kuXrzKX92KsbLSMm/+cAIDle+GYTQKfj54io/X7yYrvwgPJzt6P9iY73cc5d//CufR9s0Vi51XUsJ//9zPkhNH0RuNPODlw+wuPQjzVP7p7qTCDBacWc/ea6V/TPTxacXERn1xM0kXkOPsurqgrAtIu7+6gGjVtzYWq2LF9dy5c8v+Hx4ezsyZM5k7dy7h4eEEBATw0ksvYWFhwdixY4mIiMDFxYUVK1YAMG3aNHr16oW1tTXLli0DYNasWQwbNgwhBAsXLlQq7VpTq+DpJvBVDLTuau5sJEmqC1+fKf1ea8x/c0yqhN5oRGumO5emjp2akYuna2lRoTcY0ZrhQ3nhVCINm5vvyf30lCzcvJ1NGlOtVtGzVyhr1x4uK6zVahXTZw6geXPl/+o+l5jG7B+3ciI2Ga1azZgerRnXuwNJGaV39J/q2Uax2BsvnmPW7u2k5OfhYm3N1I5dGNo0FLXCt+f1RgPfXt7Od7HbKTHqCbb35uUmj/KAi7JX5wEK9JnsTV3I+dytANS3D6ez5yQcb6ILSGVUQlz/+Ny9yncsN+VV7St50PInSBgFtqZ5WFeSJIUU6qHet3BsKAQof6GkAnO1YeZ0s8e8N+Uys45u5vUHetDNt5GSqVVgMBr54cgJvt53hB+efhxPB3vFY6747TB5BcUM79uaL1fv41xsKp9Nfxy12nR9EE8fj+etCcsY9UJP+j/R0WRxr/v9+938Z+LXLIn6AJ/6niaNnZ1dwJgnvyAnpxCAKa/1o08fZbpA3OjP81d49pPVtGlYj9eHdit7YFGnN6BRqxX9DPzn0D7+++d+nmjekikdOuNsbZoHT4QQTDq8mPO5STzboBeD/Tsp3gXkukJ9Fisuj8JK40iE5wsE2neo1ftqar9kcX2b+v1WOi36k41NGlaSpDq2/Bx8dw429Td9bFlcV33MSQU5zDm+hQ1XSm8VPx3SjmkP9lI8P4CjV5J4e+M2TqekYaHRMH/Qw/Ruqmxhv2HXKWYv2kRIkCdpGXlk5hTg6mTL4reGU8/LNFdx485f5ZVRi8nLLqRBU1/e/+ZZ7B1N+4TvtaQM9q47Qt9numFhafr57hITM5g/byNt2wUz3MR/XBy7lMgD9X1RmfiBriK9jvMZGSbpAnKjhIJ0rDUWuFspP7vjjVKLzuJqWf+muoDI4lphP1+Gecdh70CThpUkqY51+RleDIMhyg7XWilZXP/zmEsMBpacO8inp/ZQaNAR7ODGzFYPEe5d97eKhRAIKLv9nZ5fwIdbdrM2KgaALg2DmNY7kiA3lzqPXd6eoxeZ+tE6DMbS07JGrWJI7wd5dnAn7G1NM+7r1cRMZk36Fh9/N1q0q0+LdsEENvK6IwYSMLWjR2J5sFWgyYtc6c5XU/slpz+/Tf0D4fndcCIdWriZOxtJkm7FqQy4kA2PBpk7k7tDUlIS/fv3JyYmhry8PLRaLfPmzWPdunUEBgbyzTffYGFhwfLly1m4cCGurq6sWLGiwjCr1dmdcolZRzdzOTcDG40Fr7boxlMh7bHUKHOr+Mt9h+nZuAEBrs6sPBzFx9v3k1tcjJ+TI2/0iaRHSLDiBVbUmQSmffxrWWEN4OFqT2TbRiYrrAFs7az4dO0L92UxfaNWrYPMnYJ0l5LfntukVZcOy7f4lLkzkSTpVi06Bc80BQvTdPO767m6urJ161Y6dCjtn1h+Bt4WLVrw888/o9PpymbgHTVqFIsXL65xv0n52Uzau4YxO1dyOTeDvv5N+b3veJ5r2kmxwnr1sWjmb93D9nOXGPTlct7ZtINivZ6JEe35beKT9GzcQPHC+kJ8GlM+/JkS3d/TvjnaW9O4vhfn49IqLFeag7OtLKwl6TbJK9d1YGxTCPsJ5nYEe/lgoyTdVfJ1sOI8HH/M3JncPaytrbEuN95tbWfgrUqxQc/XZw/yWcxeCg06Gji4MbNVbzp7KzthxNazF5n+6xYAPtiyG4DIRvWZ1juSAFfT9G9OSs1m8vtrAOjSugGtmgXQqlk9Gvh7mPQBRkmS6o4sruuAnz109S09QY9rZu5sJEm6GSvPQ7gP+Cs/CMQ9q7Yz8Fal76Yvic3LwFZrwWstuzOmUTvFrlRf92dcApPX/Iax3GNHj7UK5e1+PU3ax/ZSwjU+fHUgDQM80MgrxpJ0T5Df5DoyoTl8fgru/sdDJen+sigGxss/im9LZbPtVrasKrF5GfTzb8bvD49nXJOOihfWZ1LSmPDDeor1hgrLN8Wc539/PcRoKuGtGtA4yEsW1pJ0D5FXrutIz3qQWwKHUqG96UexkSTpFvyZCulF0DvA3Jnc3dq2bctnn31W4wy8VfkucgSdvIJMkuuVzCyeXbGW3OJi7K0saRvgR/sgf9oH+dPYy10WuZIk3TZZXNcRtQqea1Z69VoW15J0d1h0qvR7K7u23hydTsfDDz9MVFQUvXv35r333qNLly61moG3MqYqrPNLSlh28BhjOrSmfVA9mnl7ymJaku5BQgiSCrPxtXEyy1CKcpzrOpRWCI1WwKUR4Gpd8/aSJJlPZjEEfw9nh4OnrXlzuVPaMFO6H49ZkiRlCCGIy8/gYFosh9LiOJwezxstetPbr6ki8eQ41ybkYVM67vWyszC5pbmzkSSpOt+dhT4B5i+sJUmSpJtzvZg+lBbHwWulBXVqUW7Z+rcf7KdYYV0bsriuY+ObwzPb4aUWICd1kqQ7kxClDzIu6mLuTCRJkqSbpRNGfok/yeKze9AJY4V1LzXrxuP1W5sps1Kys1kd6+wNlhrYnmjuTCRJqsquZFABET7mzkSSJOnuJIQgPjOLVVHRvPbrZqKSUkwW21KtoZWbP542DhWWP9mgPeMbhysa2yAMNW4jr1zXMZWq9Or1ohjoXs/c2UiSVJnPT5V+T+XdJUmSpNoRQnAlK5uD8Qkcik/gYHwCyTmlXTHefbgnLX29TZJHUkE275/4nc1JpwFwsrAmW1fEI/5hvN7iIUUfYLyYd5o1CUt5zmdatdvJ4loBo0LgzYOQnA8+dubORpKk8q4WwOZ42SVEkiSptuIzsxi/ej3nr6X/Y90rkZ157IEwxXMoMej5+vx+Fp3dTZFBT317N6a37MPh9HiiM5N5r/UjqBUqrLN1GfyStIIjmXtqtb0srhXgaAmPN4QvT8OMNubORpKk8r48DUMagLOVuTORJEm6ecnXcog6l0jnlvVxsDPN0GQBLs7MeKgbY1auwVBukLmn27ViXIe2isffmXKed6M2E5efga3GgimhPXmyYXss1RqsNFrGhnTGQl33k08ZhJ5daZvYnLKaYmMRbpaeDPQbXeP7ZHGtkOdD4aFfYeqDpX2wJUkyP52htEvIpn7mzkSSJKlmQgiS0rI5eiaBI2cSOHY2geRrOUx7upfJCuv8khI+33eIJQePVCisB4Y147XuXRTthnElP5N3ozazPeUcAP3rhfJqWE+8bBzLtmnjHqhI7PO50axJWMrV4kQsVBY87D2Ubp7/wkJtWWEovsrI4lohoW7Q1AVWX4QnQsydjSRJAGsuQYgThLmZOxNJkqSq7Y26xOb9Zzh6NoHUjLwK6154PIJHuyrfDUMIwYbT55izbRdXc/NwsrZictfOfHngMI093Hmvby/FumEUGXR8cXYvX57bS4nRQIijJ9Nb9qGdR5Ai8crLKklnXdJ3HM86AECYU1sG+I7C1cqz1vuQxbWCXgyDOUdlcS1Jd4pPouEVOQa9JEk3KTM9D2dXO5PN9teykR8b953+R2E9qm8bRvVVvhvGubRrvP37dg7GJ6AChj0YxuQunXG1tSE+M4vJXTqjVWB2UyEEW5PP8d6JzSQWZGGvteKV0J48EdxGkW4f5emNenak/cYfV9dSYizGw8qbQX5P0cTx5k8asrhWUP9AeGkvHLoK7eSU6JJkVodTISEP/hVk7kwk6e5QUqLH0vL+KxOEECTGpxN9NI7oI3GcOh7H8LGRPPTogyaJbzAa+f3gWQ5Gx1VY/kiXUJ5/LELR2LlFxfx3z36+O3wcgxC09PVm5kPdCPP5eySQqQp1BYnNS+edqE3svnoRgIEBLXkltAfu1vZ1HutGZ3KiWJv4DWnFyViqrejnM5xIj75o1Ra3tL/771tjQhp1ad/rT6LhO1lcS5JZfXISJoWCVo7uf9cqMeixUGtMdvWwvGK9HiuteU6ZOr0BC61pH945fSqRQ/svMPrZriaNe50QgpTLqfgEm/7kefJILLNeWkl+XhEA46c8bLLC+kzsVd5b8gdn4lLRaNR0adWAXUcv0q1NQ6aO6anoZ/+XU2d4d8tO0gsKcLW1YUq3CAaFNftH14+6zkFnNPBJzA6WXDiAzmigmZM30x94mFZu/nUapzI5uizWJCzhRPYhAB5w7sAjviNxsXS/rf3K4lphTzeF4O8hpQC85TTLkmQWqQWwPhb+09ncmUi3ak/qWT6I+ZXJTR6mm3czk8XVGQwsizrOV0cO879hT+Dj4FDzm25DYYkOG8vSq2XZ+UV88vMezl1JY+mrj6NR4DZ8ZRLi05n+6o9YWGjQ6ww8M6G7SeKWt2nJdj4at5ilZxZQr5FpZ3tqHFoPGztL8vOKGDWhGwNGdDRZ7BKdgTNxqbRvHsjLI7uhUkFBUQlvP9cXrUbZ339Cdg6ZhYU82eYB/h3REUdr0zwwqVWpicpMxFZjwUstevN4/VZoVKb5rGtUGi7kxeBl5cegemMIcaibvuwqIco9+nmXKv/UppOTkxkzqdz4neBjCzOV7yYlSVIl3jkC8bnwRaS5M6ncnd6GKaG2x5xUkMmHpzew42rphBGjgyP4d5PeiucHcCgxgRnbtnIuPR0rjYYFD/eld8NGisU7eDqOoxcSea5fR345EMPHa3eTlVeIp7M9X748FH8PZ8ViX5eZkceLz31DSlIWAC0eDODDT0aZ/G5BRkoWB349Qu+nuqFRuKisTFZGHj8u2c24l/uY/NhjrK2T0AAAIABJREFULqfQNMgLlUpFUbEOg1FgZ2OpeNxivZ7YjCwae97eVdtbkViQhY3GElcr01+FTCqMw9PKD6269teba2q/ZHFtAqcyoOcvEDdSDssnSaamM0DQ8tLh9+7UUULu9DZMCTUdc4lBz7eX97Dkwk6KjDoa2Hsytfm/aO1WX/Hc0vLzmbtnN2tPxwDQM7gBM7pGUk/B382Z+FSenf8TzYO8KdHpibqUjEat4okerRjXrwN21soXVwX5xbzywnecP/v3NNYBQe5MeukhWrUNVjz+neR6aWSOLkjSna+m9kt2CzGB5q7QXA7LJ0lmIYffu/scSLvA3Jhficu/hq3GkslN+jAsqKPiowUYjEZWnDzBh3v3kltSTD1HR2ZGdqdHsLKFZUJaFi98+j8KinX8efYKAA829OP14d1p6Geaq4h6vYHZ09eQfi2PHr1DadWmPg+2qY+Hp2PNb74HyaJauh2yuDaRF8PgPTksnySZnBx+7+5xtTCbj05v5I+UaPh/9u48Lqpyf+D4h2GGfUcERBZXEMEFVBQBRdFy30qtNLVMzeq63EzNzNRSU7NbXU2tW+6pqbnvior7viCKuCs7su/MzPn9wU+SLHHhzAg879fL14XDmfN8T/fMme8853m+D9DR2ZexDTpR3USeBO/YvbtUMzOnnr09FxLimbx/P5FJiRgZGvJRQADvN2+BifL5qgU8rdTMXD74/g8eZOaWbHOwNmfKwA64OdrK2vajkhMzGf5hB9xrVROJpSC8IJFc60gXdxh1BE4kQoCoHCIIOiHK71UMRVo1q24fY3FMOHmaQjzMqzG+YVcCqtWVrc2opCSGb9nMjPYdWHLuLKsjLyEBIe7uTGnbjlq28ie2ufmF/Gv+Ru4lp5fabmioYOX+c4zqFYSZDoaDADi76C6RF4TKTiTXOlJSlu+SSK4FQVdE+T3duH37NgEBATRo0AAjIyN2797NnDlz2LRpE+7u7ixZsgSV6p97gPsfns+t7GRMDFV85NmBAbVao3qGyUXP6m5GOkM2/kF2YSGjd25HK0k4W1jwWZu2vFq3nk56bovUGj5evJWoO4nYWJjS3NOVFl6utPByo2Y1a9F7LAgVmEiudeidBlBnJcRmg4v8NdEFoUqLz4Etd2CeKL+nEx06dGDFihUAJCcnEx4ezuHDh/n666/ZuHEjr7/++j++9lZ2MqGO3nzs3RlnU3krYqTk5jLojw0k5+YAoJUkOtapwzevdMLcSDe9xAD7z18n0NuD0b2DqVujGgqFSKYFobIQ/Tk6ZGsMA+sXjwEVBEFe/42EN+uBvW5KtVZ54eHhBAcH8+2333Ly5Enatm0LQFhYGMePH3/ia39o9jbf+L8pe2KdXVjIu5v+4E566WEY+27eZE2kbm/MrzTzZECYH/VrOojEWhAqGdFzrWOjG0Hz9TDJDyx110kiCFVKThEsjoLjvfUdSdXg7OzMtWvXMDY2pkePHmRmZuLoWDz+zdramrS0tCe+vnV1+Wd6F2o0jNy6hUuJiQDYmJjQsqYrga5uBLq66mSMtSAIVYNIrnWslhW0c4FfrsKoRvqORhAqp1+vQogz1KkaJaP1ztjYGGNjYwC6du2KlZUVsbGxAGRmZmJjI//iJ0+ilSSmHQhHZajg05A2BNZ0xcvB4bFlnQVBqPhehhrlsg0LiYyMJDAwkODgYIYMGYIkScyZM4egoCDeeustioqKAFi5ciWBgYF07dqVzMxMAPbv30+rVq0IDQ3l/v37JccLCgqidevWXLx4Ua6wdeLfjeHbi6DW6jsSQah8NNri99fHTfQdSdWRlZVV8vORI0eoW7cuBw8eBGDv3r20bNlSX6EBxfWrp7QN5X89ejHUzx/v6tVFYi0IlYQkSVzPeMDK6POMOrSF/1w4ou+Q5EuuPT09OXr0KBEREQCcPn26ZIJLo0aN2LhxI0VFRSxcuJBDhw4xcOBAFi1aBMD06dPZvXs3s2bNYubMmQBMnjyZ3377jbVr1zJ58mS5wtaJAEdwNYcNN/UdiSBUPhtvgaMptHLSdyRVR0REBP7+/gQGBlKjRg0CAgIICQkhKCiI8+fP07NnT73GpzI0RGUolscVhMpAK0lcTUtm6ZUzjDywkeZr/0vYxp+ZdHwX+Ro1HzUK1Hu1HdmGhTxadsnY2Jhr166VmuCyatUqvL298fX1RalUEhYWxrBhw8jNzcXU1BRLS0sCAgKYMGECAKmpqbi6ugKll52sqP7dpHhRmdfrgOhAEYTyM/cCjBO91jrVuXNnOnfuXGrb+PHjGT9+vJ4iEgShMtJotUw7tY+lV88+9rfWzu58F9INpULeWh0aqexhB7JGsHnzZnx8fEhKSkKtVmNlVbzK1sMJLunp6Y9tS0tLK9kGoNFoANBq/zyZR3+uqLq5Q3oBHI7XdySCUHkcTYDkPOjhoe9IBEEQKi9JkriTks6G05GcvHlPZ+0aKhR82CgQH7vSC4Y0tndmUWgvTAzlnUoYnXWL8RfmlLmfrFF0796d7t2789FHH6FUKkvGVD+c4GJjY/PYNltb25JtAIr//waieOSbiELmbyW6YKiAMY2Ke9mCa+g7GkGoHOaehzGNi99fgiAIQvnQaiVuJD3g9K1Yzty+z+lbsSRn5dDRpx5z3+hc9gHKQZFWw9IrZ/nuwmGyigpLtte1tmdJ2OtYqIxlazu9MJPldzaxP+nJZUUfki25LigoKJk9bmVlhUaj4eDBg3zyySclE1zq169PZGQkGo2mZJuZmRl5eXlkZ2cTFRWFt7c3AHZ2dty/fx+FQoG1deUoATDIE6acgug08BRVoAThhVzPgIh4WN5e35EIgiBUDkmZ2Xy1OZxTN++TkZdf6m+B9dz5ut+rGOqgw/Nw3G2+OLmX6xkPMDZUMqpxayQk1l+PZHmHvtiamMrSrlqrYXv8Qdbc20auJh8HY1uGePQp83WyJdc7d+5k3rx5ANSrV4/p06cTHx9PUFAQbm5ujB49GpVKxXvvvUdwcDC2trasWrUKgEmTJtGhQwdMTExYunQpAFOnTqV///5IksT8+fPlClunzFQwomFxZYOFbfQdjSBUbN9egOHeYP7Pq2wLgiBUWJIkkZicibGxCltrM520Wd3KgreD/DgUfavU9iZuznw3oBtGSnmHYdzLzuCrU/vZefcaAK+61WdS83a4Wliz+24MPTs0xNncqoyjPJ+L6dH8fHMt9/ISUBko6evaid4uHTE2NCpz7p+B9LAgYAX26ElWtF7txFzw+g2uvQkO8nzxEoRK70E+1F0JV94AJ9185pSrinwPe15V8ZwF4VloNFpu3U3h4pX7XLwSy6WoWHy8avD52K4Y6mDsmyRJ7I6MYe72COLS/xyuW9+pGkuGvY61qXzL3+ari/gx8gQLI09QoFFT19qeKS3aE1yjlmxtPpRckMqvtzZw7ME5AALsGjOkVm8cTaqV7FPW/UssIqNnjmbwWh2YHwlfNNd3NIJQMS2IhF61K2ZiLQiC8FD09QROnLvFxSuxRF6NJSf3z7HFrZrV5rPRXXSSWF9LSGHmlgMlkxV7+Hlz+tZ9DBUKFr/TW7bEWpIkdt29xvRT+4nNycRCZcS4pqEMauCPSiFvOc1CbRGbYvey7v4uCrVF1DCpztDar9PU1vuZjyWS65fAx40haGPx4jJiSXRBeDY5RfDDJTik31LKglCpJKVkUb2apb7DqHLsbM2JjI7jxNnSwzD8fN2YPq47KpW8CWZ6bj7z9x5jzYkLaLQSPjUdmdQtlEZuznz82zbGvBqEg6W5LG3HpKcw9eReDsffAeC1Oj584t+G6qYWsrT3kCRJnE6L5H+31pGYn4KJwpi33XvStUYoKsXzpckiuX4JeNpCqAssjiqufy0IwtP7KQpCaoCXmBRc6eVrCjFWqPSyQESeughTpX4G9OcVFmFqpLu2795P5ctvtrHwmwEUqTUYG+k+VdCoNRgq9bPwT3ZGLluWRHA98j61GtTgjVGv6KS3GCD5QTZJKVmltnnXd2bmp70wNpb3Gth45jJzth8iPTcfewszxrwaRI+m3igUxe+3aX06YibDdVik1TDrzAGWXjmLWtLSyN6JLwLC8HNwKfe2/upBQTo/3ljFmbTLAIQ4NGeQe0/sjG1e6LiiYNVLYmJT+OYC5Kv1HYkgVBwFmuJylhP99B2JICdJkjiScoHhp77kcMo5nbZdqNEw/8JxAtcu5H62bhcwS83OZdKaXQxcsAa1RjfrO6Sm5fDJF+u4dSeZjyasYtGSgzpp91FarZa5/1rGpWMxOm8bwNzKlMM7LmBhbarTxBqKF5W7cTuZerWqA1DHw4G5n7+Gman8j7VTc/LIzi9kSLA/2/89mF7+DUsSa0CWxBpAaaDgesYDrIyMmdXqVTZ2eVsniTWAiaERMdl38DB34SufMYypP/iFE2sQPdcvjaYO0KQaLI2G4Q31HY0gVAzLo8HHDvwd9B2JIJf4vGQWXl/P6bQoAG5mxxHsoJtvU0fj7/DZ0T3cyEjFTKki6kESNS3kmXwpSVJJj7xWK7HhVCTztkeQmVeAi60V8emZuNq/+If+k+TlFzJh2gbiE4u/REReiUOlUqLWaFHqMMFcNW8Hd2MSSE3KLHtnGRgYGDB58btUr2mr83U1GtRz5tf/DMJIpWTCVxuY98XrWFrIN3HwUQMCm9KuQR08HHT7GNDAwIBZrV7FTGmEtbFuzvUhc6UZX/mMwdm0OoYG5ff/tagW8hI5HA+D9kP0G6AUzxQE4Yk0WvBaDf9rWzwspCKrLPewZ1HWORdqi1h3by9r7+6hSFJT29yFD+r1xctKB9UC8nL46mQ4f9woTug7edRnSkB7nM3lGYMcn5bJrosxDG7jz7X4FKZt2Mv5O/EoDRUMadOMYe1ayD4sRK3R8tlXGzl26kap7a9392fIW60xN5NvgY5HadQakuPScHKrVvbOlVh2TgE5uQU4OshTZk54MeVSLaRNmzYcPHiwzG3CiwlyBhdzWHsd3qyv72gE4eW27iY4mkKws74jEcrbmdQrLLy+jrj8ZMwMTXjHowddagRhaCDvGFyNVsvK6AvMOXOIzMIC3CxtmNYyjFDX2rK1mZGbz4hf/sDN3oaUrByWHz6LRivRrJYLk3u3p46jvWxtPyRJEt8v2lcqsTZUGNDA0xkLCxOSH2TrLLk2VBpW+cQawMLcGAtz3fw3F8rfE5Pr1NRUkpOTSUlJISYmhoed3JmZmSQmJuokwKrmUz8Ydwz61wOF7ufsCEKFIEkw4yzMDCgeoyhUDikFaSy+8QdHUs4D0NbBn3dr98TOWP7e/Isp8Xx6ZDeXHiRipDBkVJNARjYKwETGSYwFRWr+tXQzNxJTuZGYCoCtuSkfdwmmu7+3ziZurv7jFJt2nMepujUt/Dxo3tSDpo3cdDYcQRAqmycm11u2bGHJkiXcvXuX4cOHlyTXFhYWTJ8+XScBVjWvuMKnJ2Drbegu/9NPQaiQtt8FA6CTm74jEcqDWqthS9xBVt7ZQZ6mgJqm1RlZty+NbeV5hJeYm0VuURG1rO3IKMhnzpkIVlw9hwQE1XBneqsO1La2k6XthzRaLRNX7+TMrdiSbdZmJqz6sL/sY6sflZSciYmxipWLhuLibKOXSiyCUNk81ZjrLVu20K1bN13E81wq23jFdTdgznk43lv0ygnCX0kStP4DRjeCvnX1HU35qGz3sKfx6DlPjFnAndx4jBUq+ru9Qq+a7Z67vmxZMgsL6LttFaObtiZXXcRXJ8NJyc+luqk5nwe0o2stL9kTTEmSmLX5ACuPnH/sb63quTH3rS5Ym4leY0F4WZXLmOtr166RlZWFubk5Q4cO5fz583z55Zd07ty5/CIVSvSqBZ+dhPBYaFdT39EIwsvlUDyk5EMf+YbBCjp2JzeeAHsfhtfpg6OJfGOMCzRqhu37gytpyUw6upuU/FwUBga84+3PWL8gLI10M8Z1yaEzJYm1o7UFLeu60aqeGwF1XXGwknfBDEEQ5PdUyfWKFSv497//zdatW8nJyWH9+vX06dNHJNcyMVTAhKbFY0pFci0Ipc04W/z+0GFlMOE5jRkzhtOnT+Pn58d33333j/tNbvgeLe19ZY1FK0mMPbSNY/F3AUjJz8XH3pHZQa/S0N5R1rYfdfDKTc7djuPTHqG0rOdGLQdbMRRDECqZp/p4ys/PB2Dz5s0MHDiQWrVqodXqpqB9VfVWPYjJgOMJ+o5EEF4ep5LgShoMENV0Xnpnz54lJyeHiIgICgsLOXXq1D/uK3diLUkS00/sZ+ut6FLb72VlcOlBIrqsSBviVYvvB3XnzdZNqF3dTiTWglAJPVXPdbdu3ahduzaWlpbMnz+f5ORkjIzkXy2oKlMZFlcO+eI07Oyq72gE4eXwxani1UyN9LMqcoV25MgRjhw5goGBAYGBgbRu3VrW9o4dO0ZYWBgAYWFhHD9+nObNm8va5j9ZFHmSX6LOlPzuYGpOoLMbQTU8aF3DXacJrkimBaHye6rkevbs2UycOBFra2sUCgXm5uZs3rxZ7tiqvCFeMPMcHEuAVk76jkYQ9OtEIkSmwoZX9R1JxTNu3DjOnj1Lr169APj888/x9/dn9uzZsrWZnp5OnTp1gOIJP5cvX5atrSfZcP0y8y8cJ8y1Dq1ruBNUw4N6NvYiyRUEQTZPlVwnJyczadIkjhw5AkBQUBBffvmlrIEJxb1zk/xgyinY/fIWaxEEnZhyqvhpjrHotX5mW7duJSoqqiShHDlyJI0aNZI1ubaxsSEzs3j56szMTGxsdFde7iGNVks9G3vOvfkRSh0vYy0IgvwkSeJGWion42JJy8tjmF8zVIb6/5B4qrvN22+/TdOmTTl+/DjHjx+nadOmDBw4UO7YBGCwZ/HY68Px+o5EEPTnWAJcTS9+miM8Ox8fH6Kj/xxvHB0dTbNmzWRts1WrVuzbtw+AvXv30rJlS1nb+zuGCgW+1ZxEYi0IlYRaq+ViYgL/O3eG4ds20eznH+mwcgkLTp+gdwNvnSTWTzNH46l6ruPi4nj//fdLfh8xYgQ//vjj80cmPDWVIXzmX9xrt6+7vqMRBP2Ycqr4KY4Ya/1sWrVqhYGBAfn5+fj4+NCgQQMArly5QtOmTWVt28/PDxMTE4KDg2ncuDEtWrSQtT1BECovSZL4z4mj/O/8GXKKikr9rZqZGSt6voazhaXscVzLjGPe1S187dn/ifs9VXJds2ZNfvjhB9544w0MDAz47bffcHFxKZdAhbK9Xb+4/NihOAipoe9oBEG3DscXP70Z7KnvSCqe1atX67X9J5XfEwShYpIkifspGaTn5OProZsJYQYGBnzYvCXHY+9zMu5+yXZrYxOW93gNDxtbWdtPL8xh0fU9bLp3Ei0v2HOdn59PVlYWS5cuZcqUKXTo0AEAf39/Fi9eXD4RC2V6tPc6vIe+oxEE3Zpyqvj6V4le62fm7u6u7xAEQajgijQart5L5vzNOC7cjOXcjThMjJT8MqafzmI4FXefaYfCiUxOKtlmplLxa/deeFVzkK1dtVbDxvsnWRyzh0x1HtWMLfmwfqcyX/fE5c+HDh1Kjx49Hlv6/Pfff2fPnj0vTYJdFZYOVmvB6zf4uS20FQ8NhCriUBwMCYer/St3cl0V7mF/VRXPWRAqirTsPFaGn+X8zTgibyeQX6Qu+Vt1Gwt+Hd0Xl2ryv2/jsjL5+mgEm69dBSDI1Z1aNrasibrEr916E+jqJlvbZ1JvMu/KFm5kJ6AyMOQNjyAG1Q7FXGlc5v3ricm1j48PkZGRf/s3X19fLl26VA7hv7iqcpNeehV+uQoHeoCoIiVUBaGb4G3Pyj+Rsarcwx5VFc9ZEF5EUZEGlQ57GcIv3mDS0h3kFvw5xtnWwpRfRvellpOdrG3nq4tYfPY0C8+cJE+txt3ahklBbQirVYctMVcxUaroWLuuLG3H56Xx3+gd7EssznGDHBowyrMzrubVSvYp6/71xGEhBQUF//i3h6s2CrrzVn346iyEx4pl0YXK70As3MuGgWI1RkEQqpi83EKuXYvn6pV4rl6JJTsrn/GTulOtmvyT9gCux6ew9tCFUom1pakxP37YW9bEWpIkdtyIYcbhg8RmZWKuUjE+MJghTfwwNixOWbvU9cRQhgpA+ZoiVt46xLJbBynQFuFmVo3RXl0JdHj2CT9PTK69vb1ZvXo1/fuXnhW5du1avLwqeVfSS0ipgM+bweenINRF9F4LlZckFV/nk/2Lr3tBEITKrrBQzS8/HeDM6VvcuZ2CVls8sMC5hg3zvhugk8Q6LTuPhduPse7wRTRaCc+aDqRl55GVW8D8kb3wqlldtravpCQz7VA4x2PvAdDHqyGfBAZR3dyi1H7lnVhLkkR44mW+j95GQn46ZobGfFS/E33dA1Epnqrux2Oe+Kr//ve/9OjRg59//pkmTZoAcP78eVJTU9m4ceNzNSi8mDfqwqyzsO0OdPXQdzSCII8ddyElv/hpjSA8lK/Jw1hhopfVFbOKCrBUGeu8XYDsggIsjHXTdn5BESbGKgDUGi1qtabkd11RF2m4eOoWfoHyPPYvS3pyJjkZubjU1e3SyEZGSloG1mPD+lMlibWTsw1z//MWDtWtZG9/w9FLfPtHBFl5BdhbmvFht9Z0b+nNvxZuYnBYMxrVcpalXbVWy9RD+1kVeRGtJNHY0YkpIe1o6iRPe49KzEtneuQ6TqfeAKBLDX9G1n8Fe+MX+yLzxOTa1dWVs2fPsmfPHq5cuQLAK6+8QlhYmFg6Vk8MFTAjACaegE5uxb8LQmWi0cKE48XXuei1FqC4Z+l02jHW319J75pv0sKutc7aLtCoWXj1CEtjTvJH2Lu4W8g71vRRSVnZzNhzkJjkB/wx9C2MZF4gIze/kMn/3cY3H/ci+nYSM/+3B+/aTnwypL2s7f7Vwq+3cfJQNO993Ingjj46bRtg/phlXD15neXX/qPzti0sTFAYGKBFwtHJmm/+8xaOjrqZk5BbUER+kZp3OjTnnY7NsTAt/kL3+ZsdcLSxKOPVz0+pUBCfnYW9qRnjA4Pp5eWNQkc5poXKlFvZSXhb1WRsg2742JTPBMmn6u/u0KFDSRk+Qf+6ecDs87DiGgwSo3OESmZVDFiooIeHviMRXgaJ+XGsvreU6KzLGGBAckGiztqOSLjB1HM7uZOdhqXKmJtZD3SSXGslidVnLzJ3/2GyCwqpZWdLQmYWbrbyLSGv1miZ/N9tHL1wi+9XHWTNzrNotBI2lqaoNVqUOurJ2f77SbauOQHAoV2XaBHiibGJbnvOB03pQ1pipk7bfKhuPUd+XvIe48b+xtz/vIWjk+4m+/YLaUyob53HqoDImVg/NDO0I6YqFRZGRrK39ShzpTGLAoZTw9QWhUH5XeNPrBZSUVTFWeeH4+GtvRD9Bpg835AgQXjpFGiKS04ubVe1Fkyqivewss65UFvIroRN7EnchlpS42FWh/5ug3EzqyV7bEl5Wcy4sIdt96IA6O7mw4TGYTiYyJ9kXElM5vPte7kQm4DK0JARrZszPLA5Rkr5bvSSJPHNsv2s23OhZJuNpSmjB7TllUAvnT2pjjx7m4nv/UrdBjUIbNeAVu28qelRrewXVjKFBWpSUrKo4SLvwijC83uhaiHCyyvIGRrbw4+XYUxjfUcjCOVj4WVoaFe1EmvhcZczLrDm3lJSCpMwNTTjtRoDCaoWWq49S39HI2n57cZZvrkUTra6AA8LO6b6dSLQUZ6EvlCjYffV63Rt6ElOYSE/HDrO0hNn0UgSLd1d+aJzO2rby99Tvnrn2VKJNUC/V/3o0MpTZ4m1VqslMy2XJTv/jb2D/OOLX2ZGxkqRWFdwIrmuwGYEQPst8I4XWOtnno0glJvMQphxFvZ2K3tfoXJKK3zAuvsrOJd+CoAWdkH0dnkDK5X8vfmRafF8fmY7l9LiMVIY8q+GIQzzDCwp/1XeJEni0y27ySkswkylZNrOcOIys7A1M2ViWAg9fBvoJLENPxXD96sOltpmbKTk0rU4LkTH4tfAVfYYABQKBYHtvXXSliDITSTXFZiPffGkxrkXYHoLfUcjCC/mm/Pwiiv42us7EkHXNJKGA0m72Bq/ngJtAY7GNXjDbTD1LeVPtrKK8vk28iArr59Gi0Rrx1pM9esk+9jqeeFH2Bx5FZVCwb5rxZUKXm/iw7j2wdiYmsja9kOR1+P5YsF2JAlqudjTspEHLRt50MTTBWMjkR4IwvOS7d1z4sQJxowZg6GhIc2aNePbb79lzpw5bNq0CXd3d5YsWYJKpWLlypXMnz8fOzs7Vq1ahZWVFfv372fSpEmYmJiwfPlyatasSWRkJCNGjECSJH788UcaNWokV+gVytTm4Pc7fOADTmb6jkYQnk9iLvw3Es68pu9IBH2YdXUysXl3URkY0b1GX8Kqd0b5nPVln6RIqyG1IBdHU8vixSruX+Gr87tJys/GwcSCSU060Lmmt+w9xqvOXGDR0VP/H5MWM5WKRf16EOChm15igPSsPLZFXGbM26G09PXAqVrVHoohCOVJtgmNCQkJ2NjYYGJiwltvvcWIESOYOXMm27dv5+uvv6Z27dr07NmTdu3aER4ezvr167l79y7jxo0jNDSUzZs3ExUVxbJly5g/fz69evXi+++/R6FQMHLkSDZt2lTSVlWcDPSosUcgXwMLQvQdiSA8nw8jQGkA/wnSdyT6URXvYY+e88QbH+Bj1ZS+rgOpZizPIhWSJPHp6a20rO5BE3sXpp7dSUTiTQyAAXWbMcanLZYq+XuM9127wQe/b0H7l4/exi5OLHi9Ow4W5rLHIAjCi9HbhEYnpz+LryuVSi5evEjbtm0BCAsLY9WqVXh7e+Pr64tSqSQsLIxhw4aRm5uLqakplpaWBAQEMGHCBABSU1NxdXV97KQE+NQPvFbD2MZQt2p8LguVyI0MWH2jszYIAAAgAElEQVQdrvQve1+hchpWezSNrf1l7TH+IeoQ625fICYzhUmnt1GgVeNj68w0v0742ulmBu2F2HjGbNhekli72lgTVNudwNputPJwxcpEN8NBBEGQl+yDqi5evEhKSgo2NjYY/n8BfGtra9LS0khPT8fKyqrUtrS0tJJtABqNBiieSfzQoz9XdbenTsXCz4+xjbox/hisf1XfEQnCs5l4Akb5giJ8O7eOHaPW9On6DknQsSY2zWQ9/pqbZ/khKgKAC6mxmCuNGN/4Fd6s44+hzBVIHrqTms64TTsJqetB61putK7ljpudfHWrBUHQH1mT69TUVD788EPWrl3LmTNniI2NBSAzMxMbGxtsbGzIzMwstc3W1rZkGxTPIH70f//6c1Vn064dV/r25cMzF2h0pToH46CNKGMmVBARcXA8EX7ySSaq+1Aa/PabvkMSKpn9cTFMObuj1DZHU0u8bZx0llgDmKiUbB8xCKX4/BKESk+2d7larWbAgAHMmTMHJycnmjdvzsGDxeV+9u7dS8uWLalfvz6RkZFoNJqSbWZmZuTl5ZGdnc3Jkyfx9i6eLW5nZ8f9+/eJi4urMmMSn4ZNcDCOgwdzZ/i7fB0gMfpI8fLRgvCy00ow+gh83RLufzgcx4EDsWnTRt9hCc9hyZIleHp60rZtWz755BOg+DNg4MCBBAUFMWvWLL3EdSE1ltHHN6B5ZHyzs6kVfvY1ScjLRCPp7mbpaGkhEmtBqCJk67n+/fffOXXqFOPHjwdg5syZhISEEBQUhJubG6NHj0alUvHee+8RHByMra0tq1atAmDSpEl06NABExMTli5dCsDUqVPp378/kiQxf/58ucKukDymTiVu4UJe99DwQ6SSJdHwbgN9RyUIT7YsGowNoX9dyPz3v7FsJu/QAEFe48aNY+jQoSW/b968mQYNGrB8+XK6du1KQkJCqbk4cruTncp7EWtQKhR0cPSktWMtAh1r4WFhp7OFUQRBqHwi0+JxVTy5PJtY/rwSSY+I4JrKiR7R9Yh+A6yM9B2RIPy9rMLiSbjrPW9Q4+B63P6/t7Oqquj3sCVLljB37lzs7OyYMmUK7du3Z9y4cbz++uu0aNGCb775hvr169Ot258rBMl5zpIkse1eFC7m1vja1hA9xoJQCUmSxK3UNC7HJ9HBsy4mKt3VZi/r/iXuOJVIzvnzKEcN4NUaamac1Xc0gvDPZp2DMCc1xmMGojAWy4tWdD179uTixYusX7+ejz/+GI1G87cT1nXFwMCArm4NaWpfUyTWglBJFKjVnL4by+Kjp3h/7SZafruIrouWY2FspLPE+lbWA4YdXl3mfmIJpkqkxgcf8GDrVsYe+Iq2daYwzBtqi3UBhJfM7UxYeBkO3J6F1twcl48+0ndIwlNKSEigf//SNROdnJxYvbr4w8bBwYH69euTmJj42IT1unXr6jxeQRAqvlVnLrDp0hUi45Mo+v8KcgAKAwO+6dmJ0Hq1ZY8hqyif+VERLLt+ErWkBd9OT9xfJNeViIFCgeevv3Klf3/+3XUCnxwzZt0r+o5KEEobfxxG+UqYRqbiumQJBqJnscJwcnLiwIEDj23PzMzEysqKvLw8YmJicHBwoFWrVuzbt48WLVoQHh7OG2+8ofuABUEoV5IkkZaZh5217paE7uHbgP3XbpZKrAG+6tKBLg09ZW1bI2lZd+s8314OJ7UgFxsjU8Y0DC3zdSK5rmSMa9Sg8cGD1MspoOmaXA7GmYnSfMJLIyIOzt7NYYHTXeznzdN3OEI5+fbbb9m5cydarZYJEyagUqno1q0b69evJygoiM6dO+Ps7KzvMAVBeEZ5+UVcuZVA5I14Lt9IIPp2Eh8PakdQE/l7iwFSsnP49sBRIm7cLrV98iuh9GnSUNa2TyXf4csLu7iSnoihgQGD6rbgQ+8QrI1My1zMUExorKRuffYZV68nM7H3Is68Boaic1DQM60EzdfB9I0jqWOcj+cvv+g7pJdGVbyHVcVzFoSXXXZeAQdOXf//ZDqeG/dS0GiL00RDQwUzP+pKG3/5h3gVqNUsPXmOHw+fJKewEEdLC5q4OLHr6nU+bhfEsMDmsrUdm5PO7Ev72HE/CoAgx9p82rgjda0cSvbR2/Lngn65fvIJiY0b07zOFhZ7d+N9H31HJFR1P0VB4/PbsDu8jToXL+o7HEEQBOEvzE2MUGs07DxyhbyCopLthgoDpo/sLHtiLUkSu67GMHtfBPfTMzFRKvkopCXvtmzGges3qVPNXrbEOlddyE/RR/k5+hgFWjXuFnZ82qgDbZ3rPXP5TpFcV1JKKyu8li1jYN/+vOnant61zXDU3RApQSglKRcmn5DYsPVzvJYtQyl6KgVB+Af5+cVJnYmJSs+R6J5GoyX+Xiq3YxK4fT2R+Hup9BvaBrfa1XXSfkZ2PjfupVCoLj1xcMrwV2nfor6sbV+OT+Sr3Qc5fa94Ne/uPl583C4IJytLAIJre9CpQfnHUFy68zKzL+0jIS8Tc6URoxuGMbBeC4wUhs91TDEspJLLu3mTKYm1ic+F5e31HY1QVQ3eJ2FvLDGnWSEKExN9h/PSqYr3sOc553xNFsYKcwx0uGz5QxmFuVgb6aeHIj0/DxsTU523W6TRUFSkwcxEd4smSJLEjGkb6fN6Czwb1NDLgj8psalkp+fg0dBV523v33qe2RN/B8DM3JgvfhhIo+a1dNL2hn0X+O+aCHLyCrG1NEUCMrLzmPzeK3QJlm98s1qrZfK2vWy4cBkJaOLizKSObWjsIv88jbjcDMae+IOzD+5hAPTxaMJYn1CqmVg88XWiznUVZ1q7NiMjf4Hf/kd4rL6jEaqiQ3GgXvUL7yz7QCTWwnORJIlL6bv43413iMzYo9O289SF/BC9k+4HZ3MnO1mnbcdlZTJ860Ze/301BWq1rG39tZ8t8nYCb81axZz1B2Vt969WrzxG+L4oPh2/hv17L+u07Yd+mrCKz3rM0Uvbdb1rYG5pgqW1KbP+947OEmsArSShVmsY0j2Add+8Q52a1Zj4TgdZE2sApUJBdkEBTlaWzOvVmTWD++kksQawMTIlLjcDf3tXNrQfyoxm3cpMrJ+GGBZSBTi0bsk740P4wjuE1qPqYfR8TzkE4ZkVamDy7zf44o8JeEQc0Hc4QgWUUnCbvfE/cD8vEgWG5Kp1txjN4aSrzInaTHx+OtYqM+Ly0nC3cCj7hS9Io9Wy7OJ55h07TE5REfXtq5Gcm0NNK3meakiSxPebDjOqZzC5+YUs2HqU3w6cRytJuFSzpkijQWUo/wfHsSPX+OWncAAyM/K4HpNI+w66nzA0eGpfMlOzdN4ugFvt6oyZ2ouaHg541HPUads92/oS7FcHR7viYRij32pDfXfdDEf5olN7zIxUmKp0OxTITGnEmtDBOJlaletTEjEspIq4/933RPy4itvLDjOxhfhOJejG16c1uA4MJnhYX1zHjNZ3OC+tqngPK+ucC7X5HE9ZyekH69GiwcW0IR2c/0U1Yw/ZY0vKz2Dela3sTyzuOe3m4s9Hnq9iY2Que9uRSYl8un8PkUmJGBsq+VdAS4Y2bSZrcrts72m+/SOC2e924ds/IohPzcTe0ozxfUMJa/rsk7mex53byXw0Ygm5uYUl2+p7OjHm487U8xRlHIWXS1n3L5FcVxGSVsvFGfPoXO19Dr9pTi2xcqMgsztZ4P+7xEGb3Xj37CAWi3mCqngPe9I538g6zr7EBWQWJWJqaEVI9aH4WHeQfay1RtKy7s5xFsbsIUdTQC1zB8Y37ImfnfyP5nMKC/nPiaP8ev4sWkkiyNWd6aFhuNvYyNruvvMxjPt5K49mAj0DfRjTKxgrM90M48rMzOPD4b+SmJBBoyZutA6qT6ug+jg6Vo33glDxiORaKCFJEt+uv8rl+Hx+/rApepgnIlQhw787hV/GVYZ/PlDfobz0quI97O/OObMoifDEhcRkHQHAx/oVQqq/i5lS/v8mURn3mXV5E1czYzFWKHmnTjsG1ApCpZDnSd/FxAQaOToBsO/WDaYc2EdcVhb2pqZ8FhJK9/pesvcYR95O4L3//E5+0Z/juUd0acXwzi1lbfdRkiSxbcs5TE2MaNGqDpaWup+4KQjPStS5FkoYGBjQX3uZw19NZHO78/RoKP8jTqFq2hKVQ7uvBxD0zTR9hyJUAFpJw9nUjRxJXkaRlI+9sTsdnD6ippmv7G1nq/NZeG0P6+4eR4tEgH09xjfsTk0ze9naXHv5EpuirzKvYyemHQpnx/VrAPRr6Mv41sE6qQwS9yCDUQs3lUqsAX47cI76Lg6ENq4jewxQ/LnUtbufTtoSBF0RPddV0IG+gwlPMWbsjkVYG+s7GqGyySyEuZ1GEmqdSeiGFfoOp0KoivewR89544MJJBfcRGlgTKtqb9HMvjeGBvJObJIkif2Jkcy7so3kgkzsjS0Z69WFMCdfWXuMD925zbubN2CmMkJCIruwkDq2dnzVrgMtXGrK1u6jsnLzGfzNGm4mpALQwLU6rRt60NrbAx8PZ5RiSV9BeCLRcy08Jujn73kQ0IHJO1P4vkc1fYcjVDITIorwN8on+Nf5+g5FqCCSC25S2yKA9o4jsTZykqWNfE0hJobF9ZrjctOYc2UzR5KjMcCA19wCeL9eRyxV8vYYRyUn8cH2zWgkiazCAlQKBWNaBjLMrznGSt18HBdpNHz52z7qulRjUIdmBDbwoJq1eIopCOVJ9FxXUen5Eo3XSPwSkEN7L0t9hyNUEvsvpjAqvJCIETWwEU9FnlpVvIc9es5JisvUtWglW4/xzrjz5KoL6F6zGStvH+bn6/sp0BZRz9KZiQ174mMj/2IhcVmZ9Fn7G4k52aW29/RswMSgNjiY6ybBLShSY6hQiN5pQXgBouda+Fs2Jgb8HLuYS29uo8XxTVgayfcY9JtvviEtLY0vv/xStjYE/csqlLgwZCjzWvtiYzz9uY4hrpWqqZ5loGzHPvXgBtMurSeouie/3z3OjexETA2NGOXZmX7urVA+5/LGzyKzoIB3Nv9RKrGuZ2dPsJsHwW7uWBjpbgVEY5X42BcEuYmvrlVY+4+H4JZ1n8Wf/Vxux1yxYgXt2rXjiy++QKvVAnDp0iV8feWfmCTo10+f/4J7xm3az/nsqfYX14ogt+tZCXxybgVqScOBxChuZCcSUr0Ba4JG81atIJ0k1oUaDSO3byYpJ5uu9TyZ1b4jR4YMY9eAwXwW0pY2HrV0vnCGIAjyEsNCqrj481GcDmmD1YELtPGr8cLHS0pKQqFQMGjQIPr168fbb7+Nv78/y5cvx9vbuxwiFl5Gh27mkxjQgNY7t1DD/+lWVBPXyp+q4j1M7nNOzM/g3WM/klSQWbLNw9yBH5oNwdFU3trRj4p58IBcdRE+DtUxFLXeBaFSKOv+Jd7pVZxzE28M/jjMu1HO5Ba9+PGqV69OtWrVeP/99zl69CgajYabN29Sv379Fz+48FLKKdDy7jFjVAcinzqxBnGtCPLJLspn9OklpRJrKF4k5ve7xynSqv/hleWvnr09jR2dRGItCJVEnrrsZEkMvhLo2t6TiJm7WDL6Ip1mjuNKGjSw5ZlXcczKyqJPnz5kZ2fj6+uLhYUF169fx8PDA6WOZsILunMrE66kQcy0GQw1UNHzrfFP/VpxrQhyKdSqGXduBTeyE7FSmdLcvg4B9vVoYV+XGma2+g5PEIQKKib9AZ8c3sHF5ATO9n7vifuKr9ICAEN7+VJj+Vz6fX2CLtshYD28uhUyCkrvJ0kSavXf9/osW7aM0NBQjh49Snp6On5+fly6dIlGjRrp4AwEXckoKL42AtbD2B9P4/b7Dxxt9dZj14pGo+GfRp2Ja6Xi2rFjB15eXgQFBZVsU6vVDBw4kKCgIGbNmlWyfcyYMQQHBzNq1Cidxbc99hwt7OuypNVIdrWbxMwmb9LTtblIrAWhEpEkiXsP0snKKyh753JSz8aeEb4BqCVtmfuK5FoA4KPrNfhPv/n86+eBmBTkkJwPu+5Bvz3Ff9doNOTn51NQUPCP5bISEhKoX78+GRkZ3Lp1i86dO+tlgtrMmTNp3rw5VlZWODg40K1bNyIjI0v+/sUXX2BgYFDqn5PT47V1FyxYQK1atTAxMcHf35+IiAhdnsZLq9+e4msjMzOXSUsG8MPr37O5sCb99hTf8AoLC8nLy0Oj0fzjMfRxrYjrony0bNmSCxculNq2efNmGjRowOHDhzl8+DAJCQmcPXuWnJwcIiIiKCws5NSpUzqJr6drc4bUaYu3dU0MDcRHnCBUBjkFhZy4cY+fwk/ywZJNhExfxPLD57Aw0U2lnTx1Ed+dP8qog1ufan/x/FXgZiacTYZkv9eonnYXk8Ic8o3NURlocTRSk5Chwc7UEGNj4yfWoR0wYABvv/02c+fOZerUqdja2nLu3DnGjh2rw7OBAwcOMHLkSJo3b44kSXz++eeEhYURFRWFnZ0dAJ6enhw4cKDkNYaGpasGrFmzhlGjRrFgwQKCgoJYsGABnTp1IioqCjc3N12ezkvl4bUCUKQ0ZmGv2Rxt1J2GNmqCq6lJzAQHCxVGZZQW08e1Iq6L8mFr+3gP8LFjx3j99dcBCA0N5dSpU9y9e5ewsDAAwsLCOH78OM2bN9dprIIgVFzhUTc4dPUWF+4mEJOQgvaRJ6Gvt/BlYve2sq6mCsUdRptuXmHW6YPE52RhrlQxzj+4zNeJ5Frgahok5xf//Hv7sdhlJOB98xg2Ac0Z6VVAeoEhNsZaNBrNE8fDenp6cuLEiZLfExISiIyMJDBQvhq2f2fXrl2lfl++fDnW1tYcOXKEbt26AaBUKv+2V/KhefPmMXjwYN57r3hc1Q8//MDOnTv58ccfmTlzpnzBv+QeXiv+V/aAgQFHG3UHtHzfIo/YXAUp+QpsTdSPJaV/pY9rRVwX8klPT8fKqniShrW1NWlpaaSnp1OnTp2SbZcvX9ZniIIgVDA+NR1ZeeQ80fHJpbb39Pfm817tZU+szybFMe3Efs4lx2EA9K3ny8f+wTiaWZSqFvJ3xDMzgQa24GDy5+8uyTFM+6kPUTdT6b3fAivj4kSprITpUd9//z2dOnViwYIFZfZiPmrGjBlYWFg88d+zPobPyspCq9WW6nG7efMmLi4u1KpVi/79+3Pz5s2SvxUWFnLmzBk6duxY6jgdO3bk6NGjz9R2ZdPAFjwKk5mwbDBqxcPavAra77bkj7tGOJiA6hlr9urrWhHXxZMlJCTQtm3bUv/69+//t/va2NiQmVlcmSMzMxMbG5u/3SYIQsWRnpHLiTO3WL72OJNnbGTd5jP/OI+mvBVpNOy+FMOVuKRS27s08WLaax1QKORLrOOyM/nXgS302rqCc8lxtHRyZWuPQcwJ7oSjmcVTHUPUuRaA4glqu+79+fuwjRNwj4/iwJeb2N3dAK1WS0FBAUqlEqVSKds3xtTUVFJTU5+4j4uLC6ampk99zL59+xITE8Pp06cxNDRkx44dZGVl4eXlRVJSEl9++SVXr17l8uXL2NvbExcXh4uLCwcPHiQkJKTkONOmTWPlypVER0c/9/lVdGqNxDfNe3PLvh6Les8u9bdXXGFHl+Ix1wBGRkay9iy86LXyMl0XFfEeFhQUxOHDhwHYsGED0dHRTJw4kW7durF48WLi4+NZtGgRixYtYuTIkQwePJgWLVqUvL4inrMgVFb5+UWcu3SX6OuJxNxIJPpGIskpWSV/79uzGSPf0c0wjP1RN/hmewR3UtJRGirwcXHk/N14OvjUZe6bXVAaytMvnFNUyMJLJ1h86RT5GjWuFtZMahHKq+71Hjtvsfy58FTWdCieqHY2ufix/+Y+0/h8bnva5F4FGqBQKDA1NUWtVpc5PORF2NnZlYx/LcvKlSsZPnx4ye87duwgOLj0WKixY8eWTLJ62PPeqVOnUvu0bNmS2rVrs3Tp0lJjfv/6ZpIkSfYby8tu7qF0TK0suPv+dBwyiq8VBxPwcyi+hgwMDDA2Nkar1VJUVPRMPdHP6lmulb8S18XzO336NBMmTCAyMpKwsDC2bt1Kt27dWL9+PUFBQXTu3BlnZ2ecnZ0xMTEhODiYxo0bl0qsBeGfaDRa1GoNxsZi1UpdMjJSci82jRVrj1OkLj0Z/c0+LRg2KET2+9ylewnM3XaI07diAXi1UX1Gv9qa6PgU/jh9mdlvdJYlsdZKEhuuX2b2mUMk5mZjoTJiol8bhnj7Y2z4fLmOSK4FAKyNYWfX4trF0engaWOE0ZuH8F9nQOiNbALrFD8K+WtS/SJvtr97aDJjxgxmzJjxxNc9TKK7d+9OQEBAyXYXF5dS+40ZM4bVq1cTHh5O7dq1//F4FhYWNGzYkJiYGACqVauGoaEhCQkJpfZLSkrC0dGxzPOqrI6di+XHq1Yc2bqcURaPXiuP10RXKBSPJdb6vFYeJa6LF9OsWTP27t372PaVK1c+tu27774r17YLNA8wUthioIcqIGmFGdga6b6HXZIkUvJzcTA113nbBUVqCjUaLE2Mddbm4hURBLWoi6uLLdaWpnr54pqbnY+ZhUnZO8ogOTaNQ1vOkpmWQ0g3P+r41NRJuwqFASqVAqVKUSq5Hti3Je8OCJL1/weNVsuna3ex9dxVAJq4OTOuawhN3ItXjVYZGhLi5YGR8umHpj6te1kZjAzfxMWUBBQGBrzp2ZixfkEv/H4TybVQSi2rRxMlA35mJ1df+YIGFw5ja/745VLeo4pGjBhB3759n7jPwyTa0tISS0vLv91n1KhRrF69mgMHDuDl5fXE4+Xn53P16lVCQ0OB4uEM/v7+7Nmzp6QCAsCePXvo06fPs5xOpZGeo+Zyv74sePttaloUPy0ofa2UTZ/XykPiuqiYJEnDnczfuZL2Aw3sRuNh9XrZLyonueo8Vt3dyu6Ew8xpPB538xo6a/tuVjqTju3iXlYGO3sMwUSpu97cM7fuM+WPvfjWdGJm31d10ubuA1H8tuEkScmZnDx3mw+GtKVzmG5Lud6/mcRXw39h6pJhVHd5vidjL8JQqWDT/w4ydHJPnSXWJW0bGiJpwczUiNy8Qga/EcjgNwJl/4JjqFCg0UrUtLNibKdgOvqWHobhZPP3n/PlwcHUjNT8XFo7uzM5IJQGdtXL5bgiuRaeqMvbHVm74FsWDv+K8cun8HdzCFasWMEvv/xCSEgIn3/+OYoXWOb3RR71P/TBBx+wfPlyNm7ciK2tbUlP48NJbh9//DHdunXDzc2NpKQkpk+fTk5ODoMGDSo5xtixYxk4cCAtWrSgdevWLFy4kLi4OEaMGPFCsVVEWgkWvD+LOlamdP70yatSlUWf14q4LiqmjIKrXEyZRnpBJApUaLQ5OmlXkiSOp17g55trSS3MwFZlRXpRJu7In1wXaTX8EnWab88dJl+jxtfeiZT8XGpayN9znp1fwLydh1lz4iIAXs4OFGk0qJ5hQvvzuBITz+z/7gRgX8RVDA0VZGTmydrmX2k0Wr799yo0ai2xN5P1klzbOVrz313jsbLT/ZOKzmE+tA6ow+QZmwjwr8Wg/rqr9PVZz3aYGSkx0vEKvSZKFX90HYCDqXn5fomQZBIbGys1bdpUMjY2loqKiiRJkqTZs2dLrVu3lt58802psLBQkiRJWrFihdSqVSupS5cuUkZGhiRJkrRv3z6pZcuWUtu2baV79+5JkiRJly5dklq3bi0FBgZKFy5cKNVWenp6yT+h/GXeuS9tsa4ufbvq/N/+PTExUUpOTpY6d+4sLV26VLp27ZrUsWNHSZIkadu2bZJSqZQkSZKSk5OlFi1ayB4v8Lf/pkyZIkmSJPXr109ydnaWVCqVVKNGDal3797S5cuXHzvO/PnzJXd3d8nIyEjy8/OTDh48KHvsL6O5uxOkTXY1pIzb9174WPq8Vl7m66Iq3sPKOuciTY4UmTJb2nyjsbT5hq90NPZdKavglk5iS8p/IH11+Uep5+GRUq/DH0gLr/8mZRfl6KTt88lx0qsbf5Hcf50leS3/Rvop8qRUpNHI1t6uS9ckjUYrSZIk7Y+6LoXOWCx5T5gnhc5YLO2Pui5bu49KTsmSeg1eIAV3n13y753RS6Rbd5J10v5DNy7fl85GXJW0Wq1O233ZnDp3S98hvPTKun/JVi0kPz+fvLw8evXqxd69e0lLS2PQoEFs376dr7/+mtq1a9OzZ0/atWtHeHg469ev5+7du4wbN47Q0FA2b95MVFQUy5YtY/78+fTq1Yvvv/8ehULByJEj2bRpU0lbYta5/G6djiLokidLwgzp4Pr3+2zdupWtW7cyffp0evbsyZEjR+jVqxf37t3j4MGDLFy4EAsLi1KTEIWX2757EgP2G3C8QybuNZ5hDEgZxLVSWlW8hz3pnONz9hOZMpN8TSJGClsa2o/DxaKL7I+nNZKGrXEHWH13K/naQjzMXBhR9w08LWvJ2i5AdlEBc89GsPTKGSSgXc06TGvZQdbe6vN34hjy8zpWj3yDnw6cZMfFawD0C2jEmFeDdDLWuqBQzb8+Xc2VmPiSbQYG4OPlQpvA+vTu4idbdQhBeF56qxZiYmKCicmfEwJOnjxJ27ZtgeLVulatWoW3tze+vr4olUrCwsIYNmwYubm5mJqaYmlpSUBAABMmTACKy265uro+dlKCbtRq5s3KB+fY8MEGPFdOx+3/h0BlZWXRp08fsrOz8fX1xcLCAltbW3Jycrh9+zZGRkZ4eXmRnp7O2rVr2bdvn35PRHhq97Jh35CPWNmzNe413njh44lrRShLblEckQ9mkZh7AAA3y9doYDcaI8Py+2L3T2Ky7vDjjVXcyrmPkULF2+496VajHUqFvMMhAPbcjeHz43uIz82imok5XwS0p4uHl6xfJu6lpvPR8s0UqjX0X/AbhWoNHtVsmdY7DP9auhnrK0kSc+fv4kpMPEZGSpo1dks9YgcAACAASURBVCcooC6tm9fB1kb3wyIEobzobHDLP63g9ddtaWlpJdsANJriWatarbZk26M/C7oT1LI2he+sYPKMABZ/2RVjQ1i2bBmhoaFMnDiRfv36ERISglKpRJIkFi5cyLBhw1i3bh3bt2/Hz88PC4unK8Au6FeBBj6buZ23Lm8hZN2X5XJMca0I/0QrFXEzYwXX0n5EI+VjaVSPRtUmY2fSRPa2c9V5rLy7hR3xh5CQ8LdtyLDa/ahuYi9Le8l5OSWVCBJzs/jixF523CnuMX6jfmMm+LfF2ljeShWZefmMXLqJ1JziMc2Fag29mzXks+7tMFbpbszrjn2RYGDAlxN60LypB6Ym8pXuFARd0tm7yMbGhtjY4tqFT1rBy9bWtmQbUDLh6dGJTy8yCUp4fkpra1r8toyiXv34JOA83/WsTkJCAk2aNCEjI4Nbt27RuXNnoLhH4siRI8ycOZPdu3czb948Vq9ereczEJ7WhG3J9F04lObrVqEsp5X1xLUi/JNDsf3JKozB0MCEBnZjqG09AIWBvJUxJEni+IPz/Hzr9/+fsGjN0Nqv0cq+qWw9xlfTkvnq1H6WdujLyujzzD5zgKyiQupa2zMz8FWaO8rfY1yk0TBm5VZuJpVegGnHhWj8PVzo6d9Q9hgeerWdj86rgQiCLugsuW7evDkLFizgk08+Ye/evbRs2ZL69esTGRmJRqMp2WZmZkZeXh7Z2dlERUXh7e0NFFcGuH//PgqFosqMSXwZ2YQE4/X5JL6+mc6Sq9UZMGAAb7/9NnPnzmXq1KklS0lrtVr69OmDgYEBVlZW2NjY0LhxYz1HLzyNZdGwO9WCMYt+xDa0bbkdV1wrwj/JKozB0SwEH/tPMVPJX40jKf8BP91cy+m0SAwwoJNTCG+5d8dc+fQrvz6rhJwshuz5nXyNmte2r+BschxGCkPGNg1iuM//tXffcVXX+wPHXwcOQ/YUcCAIuRW1HGxUMlEry9yzdX9mpdeG9et365Ytb/NaObIyM3NUVo5cuSfuhTtFcYEiG4GzPr8/zpXES7k4A3g/Hw8eyRc47/f5xPmcN5/vZ3S67cMqboVSijcXriH1hPk4XgeNhraNQkhoGk5803CaBgdYPIdrWfIIayFsyWILGvV6PSkpKezatYv27dvzzjvvsG7dOhYvXkxoaCgzZ87E2dmZb7/9lqlTp+Lr68ucOXPw9vZm1apVvPrqq7i6uvLNN98QGhrK/v37GT16NEopJk+eTNu2f9wurI2LgWztYEYRo6fs5q0xCcRbb9tXYWGbL8C7b//EW/0iaJsoBa611MY+7NrnfEW7k2C3rhYZMVbXnKBpXrC4lrkZv1L2nwWLT0UOoomFFywW6cvot3QOh3Mvll/rFNSQd2LuI8LbMtNPKvPV+h18s2k3cU3CSGgaRvRdjfCuY5vDUoSozm7UZ1usuLam2vjGZGvFhw+zIzaev4/fyg+j7uKuqpk5IGzo93zo+/kJJv2rMx3Wr8W9VStbp1Rr1MY+zBrP+dyVLA4XniA5KIZjhelMPTGXU8XncHFwZmBoL3qHdLH4gkWDycTjq39k/bn08msa4IX2CTzZsiPOFt4/+iqdwcDxrMs0D6krI8ZC3CGb7RYiajb35s2J/OerTPx6OPfX38jmflr8ZQCk2sophfsXGfhozjAi//GKFNai2svTFfDmocm09m7KyaIzLM/c+J8Fi634W+P+FluweC2lFK+mrqxQWAO08g+mxKDnXHE+4V7WOajEWaulZf0gq8QSoraT4lrctvrPPkvO8uU8mr+Rh5Z34bf7wcU6gzCiCumM8PAKeMQ1g/Cou6g/dqytUxLijpQay3j78FSyyi6TdXELAH7O3jwR3o/O/m0tvl/2VVMPbGPusX0EuLqTUD+MxPqNiasXhr+rm1XiCyFsQ6aFiDuijEaUgyODFpfg7F6HWV3NBwCI6kEpGLkG1LkMvhoQgpOLZXdoEJWrjX2YpZ6zURl59/B0duWmlV8LcPbl/aiX8HH2rLI4N3KqIJdlp4+SUC+c5n51cZCOUYga40b9l+xpJ+6IxtGRkoNpPPdiO9Izi5mw09YZiVvx9m44fqGY0W/dS8GqlbZOR4g7opRi+on5FQprgGxdLtNOzKXUWGa1XMK8fHmqdWda+gdJYS1EDVFYVsamjNM3/D6ZFiLumHurVnh36shna5/nITWNUE94tJmtsxI3MusofHEIFm4cj0uHe/Dv1cvWKQlxRxacXcHKrM0AeDt50tanGVE+zYnyaYafc+24IyCEqFpnC/KZsmM7uy+c5/jlyyhgz8jH//JnpLgWVSLy00/ZGRXFwh4r6LHtPjycoF+ErbMSf2bBCXgpFVZGHqD4H0totW+frVMS4o5syd5NWsFxhjfqQ1vf5jRyq4eDRm7OClETGYwmtI7WeX038PImpmEoPxxM42bnUUtxLaqE1tub1suW4RoayrIS6L4E3LTQq5GtMxPXW3oaRm+E5b0UrQNbo9+zp8pOYRTCVjr6RRET0N7WaQghqlhBcSmHMrI4eCqLQ6czMZhMvDH8Pnw8LHfo01VKKdakpzMpdSvGW1iiKMW1qDLuzZtTmpGBx6TXWPjiBzywTMO8e6Gr5U/0FTdp3TnzAsaFPRSuY4eQN2oUPgkJtk5LVCPLli1j3LhxBAQEsGnTJgDWrVvHiBEjCA8PJzQ0lFmzZgEwbtw4du7cSfv27Zk0aZJF87L0ftVCCOs4dDqT3cfPcfB0FgdPZ3L20h+LB5s0CGTa2L5WKawPXbrI2xvWs/Ws+UTT7hGRbDx9Ch/XG8eWe2aiSjkHB5O3Zg2NlnzFD/fBwN9ga6atsxIAqZnQbyXM7w5hy76m+OBBvDp1snVaoprp3Lkz+yqZRjRs2DDWrVtXXljv3r2b4uJiNm7ciE6nY8eOHdZOVQhRDbm7urBi51FW7Dxqk8I6s6iQF1eu4P45s9l69gyt6gYx75H+TOv9AHf5+/Nd30du+Bgyci2qlIOzM82++459iYl0TEpiVrdI+iyH5b2gXaCts6u99mbDg8vhm67Quewke156iai1a3FwcbF1aqKa8fX1rfT63LlzWb9+PaNHj2bQoEFs3bqV5ORkAJKTk0lNTaVDhw7WTFUIcRuMRhOZF/I4fSqbjPRsnF209Hmkg1VO9lRKceZSHmUGY4Xr1iisi3U6pu/ayZe7d1JiMBDi4cmLsbE80LR5+Y4/X9zfh0B39wpb8VVGimtR5dxbtKDx+++ju3SJHtGRTEuAnkvh157QXgpsq9ubDSm/wuR46NkI9NleNJkxQ05hFFXmnnvu4ciRI+h0OpKTk0lOTiYvL4+ICPOqZm9vbw4ePGjjLIUQf6a4qJRpn67i2NELnMm4jF5nLm7btA1lwr/6W6WwPpB+gU9+3sSu42cBqO/vxbnLBTRpEMhUCxbWRpOJHw8d5OPULVwsLsbdyYnno2N5vH17XLUVz34IdHe/qceU4lpYRPDIkSiDgbz163koMREF9FgCC+6D+Hq2zq722HQBHl4OUxOgbwRkffcd3gkJBNx/v61TE3YuMzOTgQMHVrgWHBzMvHnz/ut7PTw8AHByciIhIYHjx4/j4+NDQUEBAAUFBfhUwaJZveE8WscgNBrrz6/O0WXj5xxg9bhKKbJKCgl287J67Cs6PTqjEZ86rlaJp5QqPz0zO68If293q52medXu1BME1/elXkPrHEt/vbTNR/AL9qVehHWPqnf3cCWscSDLf/1jyldMfBP+7/WHcHaxbKloNJl45aul/Lb7OACtwoIZ81AchVfK+PzXVKaO7YuvhQrrswX5/G3xQo5kZ+Og0TCoVRv+3jn6povoPyNzroXF6C5d4lD//hRs387DjWHOvdB3hXm3CmF5y06bC+vvks2FdeHOnZwYN87qb1aiegoODmbdunUVPiorrIHyItpoNLJjxw7CwsKIjo5m9erVAKxatYrOnTvfdi5KGcgtnMbprATyi2fe9uPcjiuGIuZnfMmbB//O2SunrBo7vfAywzfOYvCGmVwx6Kwae0t6Br2/nMXry1dbJd72gxlsSzuNUopf1h2g30sz+XndAavEvirvchHv/9+PvPzkDE4es81ioQkD/s2cd3+2SWx3D1dcXc0jtd17tuG1N/tavLAGcHRwwMVJS2hdH957shffjB/IPU0aEh7sZ9HCGiDQzZ0rej2JjcJYOmQYb3dLvuPCGmTkWliQS0gId332GUeGDuXuPXtIbuDOohTz3N9JsTDwLltnWHPN/x3GbIKFKRAdDMYrVzg8dCiRn3yCSwPZvkXcvp07d/Lyyy+TlpZGcnIyS5Ys4fvvv2f69Ok4ODgwaNAg6tWrR7169XB1dSU+Pp6oqCg6dux4W/FKdXu4mDueMv1BNBpXwDp/HCql2J27hZ/OzaLIUICPkx8lxitWia0zGfny2GamHtmIzmSknV8D8nUluGmdLR47v6SUf63ZwI/7zNN4OoY2QG804uRoubsFZ7PyeGXyYh5KasOcFbtIPXAaJ60jer3BYjGvZzKZ+ODVn8jNLgJg3bL9NGociKPWundJPvjtVTz9PKwa86p7e7SmuKiUy9lFPDm6q1UHYl7sn4Sri1OF37OwYMvfPXDRavl5wGB861RtAa9R6hY27rNTNzrjXdjW8WefJWjIELz+M3J14LJ5DvA/7oZRLW2cXA00/RC8sROW9YI2/uZrBdu3kzVzJndNmWLb5ESlamMfdqPnbDQVcDl/IvnF3wAKN9du1PV5BydtQ4vndrnsIt+f+YojhfvRoCEhsAc9Q/rh6mj57b/2XD7Dq3uWcLzgEh5aF55v1Y2B4Xdb5Qj1FUeOM2HFGi4VX6GBtxcTUpKJa2zZwwqKSsp4fMJc0s/nlF9rFhbEP5+8j4gG1puGs2DWZr74cDmhjQO594F2dO0VhX9d60/FsbWcy0X4+dumuK9ObtR/SXEtbOJkAdy7GEY2NRfZMlPhzikF7+6GLw7Db/dDpLwUqo3a2If92XNWSlFUsoRLea9hNGXh6BBEoM+beNTpZfGRNKMysPbiUpZfWIBe6WhQJ5yBoU/Q0K2xReMCFOpL+ejgGuae3IkCutdrxj+iehBUxzIF3qmcXII9PXF10nKxqIgJK9ay8ujvaIARHdoxNjEGd2fLjpQbTSZe+PdCNu9LL78WGuzLjNcG4eVunXneABfO5rBobipJKW1o0rK+TJ0TNyTFtbBbF4rNU0QivOCrJHBzuuGPiD9xRQ9PrINj+bCwB9SXgYdqpTb2YZU9Z70hg4t5r3CldA2gwdt9JP7eL+HoYPkRxFPFx5mX8QUXSs/g7OBCr5D+xAfeh6MVFk+uOn+EN/Yu42JpIXVdPfln2xSS6zWzWLy8klL6fzOXz/v1YdfZc0xcvYGC0jIiA/x4p1d32tYPsVjsa03+fiPf/Fpx/3NHRwfu69yMl0d2w9VZ3hSEfbpRny1zroXNhLjD+gfhb+sh/hf4JQUaSlF4y84WQZ/l0NQHNvaBOvKqFtWMUnpyCz8np/AjlCrFxakldX3fw9W5ncVjlxivsPj8XLZkr0ahaOXVnr4NH7XKziBZJQW8uW85v50/ggYY3PgenmvZFU8ny43a6oxGnlmwmFM5eYz6YSHpObk4OTjwTFxnRsV0wFlrnQ5k+dbD5YW1u6szMVHhJLSLIKZNGJ5WHLUWwhLkbVjYVB0tzOoKH+6DTgvgh+4Qa51Bkxphy39OXRzbGl5sK9NrRPWUkXUfOsMRNBo3Arxfx8fjMTQay749KaXYl7edBWdnUmDIw9vJl74NRtLGu4NFpgXoTUac/nNEu0kp5qXv4sO01RQZyrjLK5AJ7XrT3t+y88mVUry6dBXbM8z7CKfn5NKmXjDv9LyXJnWtN7/50MlMvvh5K327RpHYPoK7mzfEycoLB4WwJCmuhc1pNPBCW2jlBw8th3c6wRMtbJ2V/ZtxGF5OhZldzYfDCFFd6QxHcHftQaDPmzhp61s8Xo7uEj+c+ZpDBXvQoCE+oDu96g2gjqObReIVG3S8vudX3u/wEMcLLvLq7iXsyTmLk4MjY1sk8USTWJwdLF9cfr51Bz8fOFThWl5JCefyC6xaXPt7u/PDxEetcjCJELYgxbWwGz1CzdMaHlwOmzNhUhx4WX7nqWqnUAd/32w+IGZDH2hW+WnUQlQbIf4z8KjTw+JxjMrI+ovLWJb5IzpTGfVcQxkQ+iRh7pEWi2kwmXhu+wJ2Zmcw6dBavji6Gb0y0SEglAntetPY0zpF7bLDx/ho3ebyz50cHekU2oDEiDDC/a3biQT5e1o1nhDWJgsahd0p0sO4zbD6LMzqBnEyTaTclkwYthq61IOPY8FT/vioEWpjH2bt53y6+ATzz3zBuZLTOGmcSQl5hKS6KThacPqJUooJ+5Yx5+TO8mteTq6Mb5VM37B2VtleD2Df+UyGzv4e3zp1SIoMJzEinM5hDS2+G4gQNZUsaBTVjocTfJEEi9LN84kfbQqvdwDnWjwlT28071395WGYlgh9wm2dkRD2S2fScawwjVbe7Sk1lvDrhe/ZeGkFCkVzr7b0a/AY/i6BFs9j5u+pFQprgPGtkukX3t7isa8ymkycyL7MjyMH0yTQX7aZE8IKpLgWduuBcOgUBI+vg+ifYHYyNK+FUyCO5MLQ1RBUB/b2h2DLTAsVokYwKRPfnpqMu9YDkzLy49mZ5Otz8NR607fBCNr6dLZKgbni3GH+deC3CtccNRp+ztjHXd51aetnnZNSHR0ceLiNnNYlhDVJcS3sWpAbLE4xH4wS/wuMagH/2x7ca8H2p8V6+NcemJwGb3U0n2Ypg05C/LVfzs1mf/52nDRObL28BoAY/27cX28Qblp3q+SwN+csL+74GQUE1/EiISiS+KAIOgeG4+Us28wJUdNJcS3snkYDf2sBPUPhpVRoNhfei4aBkTWz2FQK5v8O41MhNtg8Wi37fwtxY+suLmX9pWUA6JUed0cPnmj8Ao09mloth6ySAmaf2MG4ll2ID4okwjNApmIIUcvIgkZR7Wy6AGM2gbsWPomDdpafOmk1e7PNz61QD5/EQny9m//ZDz/8kNzcXN566y3LJSgsojb2YVX9nPflbefr9H+jqPiW1tyrLcMaPY271jp/oSqlpJgWogbKLynlwPks9p/PZEibP05QlQWNokaIC4EdfWHGEUj51byF30vtqvd87CO58N5e+PU0vNkRHm8Gjg5//v2zZ89mxowZJCQk8Nprr+Hg4MCBAwdISUmxXtJC2In04mN8e+qz8sLa28mPZp5taObVhqaeraxWWANSWAtRQ2QXFbP00DH2n8vkwPlMTuXklX/t2uK6MlJci2rJ0QGebAH9IuDTA5C0EGKC4aW20DnY1tndvG1Z5nnVmzPh6VZwZBD4utz457p3706PHj0YMWIEs2fPZvjw4Rw4cIDx48dbPmkh7MjF0gvMTP+ESI8WNPVqQ3PPNgS51pciVwhxR/zc3TApxfJDx9CbTOXXXbU3Lp1lWoioEa7ozSPZH+yDRh7mkeweoWCPB4CZFKw8Yy6q0wvh+Sh4rNntLdJcsmQJS5YsYfLkyQQEBHDp0iW0N/HCF/alNvZhVfWcL5Vl4uPkh5OD7NksRE1zOb+Y46cvcez0Rc5fzGfEA50ICfSySuxTl3P5aO1mVhw+Xn7NRevI5wP70MLvjz5LpoWIGsvNCZ5pDf/TAr4/Aa9sg1EbYFAkDL4L2vjf2eLH9AI4nGueehJ+G69rpeBADsw5DnOPg48LvNgWBkSA0y3u311YWEjfvn0pKiqidevWeHh48PvvvxMWFiaFtah1Al2q0a0qIcSfOpuVx+GTmRw7fZHjpy9xPOMSl/OKAfBwc+Hj8Q9bpbC+XHyFyRtSmb/7AAaTiTA/H7IKizApxbQBDxIdHlphcKAyfzGr0/6MGzeO+Ph4xo4da+tUhJ1ycoQhTWBPP1jS0zxy/eByaDkf3toFx/LMhe7Nyi+DHkug0wLotdT83x5LzNevVdkNIKXgeB68vQtaz4f7l5qvL0qBvf1gaJNbL6wBZs2aRZcuXdiyZQt5eXm0b9+eAwcO0KZNm1t/MCFu0RdffEHnzp3p3Lkzc+bMAcBgMDBs2DDi4uKYOHFi+fdKny2EuFmlZXq++mkr3y7eQer+U+WFtZeHK5+90o/Wd93CCv/bcEWnZ/KGVJI/m8F3O/fhXceV11K6smTUcEK8vJjS/0FiGje6qceqNsX17t27KS4uZuPGjeh0Onbs2GHrlIQd02jMo9Xvdob0IfBlEmRdgS6LoP4s6L8SPtkPuy+BwfTnjzPgN1hxBi6Vmj+/VGr+fMB/zoYwGo2UlpZSVlaG3qjYfcn8uANWQoNvIXEhXLgCnydC+lCY2BmiAu5sFD0zM5MmTZqQn59Peno6PXv25MCBA7Ru3fr2H/QmTJkyhfDwcFxdXbn77rvZuHGjReMJ+3TvvfeSmprKxo0b+fDDDwFYtGgRzZs3Z9OmTWzatInMzEzps0W1dO5cjq1TsBmdzkDWuVwO781g08o0Vi3cjUFvtFr8Mr0Bf5+Ke9H7erkx5f/60yw8yGJxDSYT83fvp/vkGXyyfitKKZ6O78TKpx9lyD1RODk68nHfnsRF3FxhDdVoWsjWrVtJTk4GIDk5mdTUVDp06GDjrER1oNGYFzvGBJu37jtVaN7Ob1MmTD8EGUXQ0g8aeUKoh3lP6VAP889tz/rvx3PQKNw1BlanG8gqdWT5eRd+z9eQlmP+2bgQ6N3IXEiHeVb9XtxDhw5l+PDhfPDBB7zxxhv4+vqyZ88ennvuuaoNdI358+czduxYpkyZQlxcHFOmTCElJYVDhw4RGhpqsbjC/oSFhQGg1WpxdDTfetm6dSv9+vUDoEuXLuzYsYOMjIwq77OV4Qw4hqDRWP+tK093Dh/n+laPa1QmMktyqe/mb/XYBWVl6E1G/OtY/1jYc5fzCfH1wsGKC2dOn87m7TcX8tG/h+DhYZvDfnavPUhAPV9Cm1p2lLYycyavZv4X6wGoHxbAPz8bivZ2bq/eIpNJ8coni1m3wzy32dPNhcIrZQT6evDpK48QVs9yv/tncvP529xfOHk5B0eNhgHtW/NMQmfqelbcYahZ0K3t+VttRq7z8vLw8jLPtfH29iY3N9fGGQl7dur111mv0ZR/FO7aReGuXWxw0JDhrSG0mYb/Xfs6aQNh2av1mNhXw1PdNSQ+djdHcuH0U3/DO1zDz09oWDdag3/eeaL3L2bdaA1rnnJgTG9ncmd+hZ+L4vFkB97tq2Hxkxrmzu7N1HgTbV+4nwxvDRsczPEBzk+fXiGn7MWLb+u5NW3alG3btrF161ZSUlLIzMwkLS2NmJiYqmzCCj766CNGjhzJk08+SfPmzfn0008JCQlh6tSpFosp7Nu0adPo06cPUHn/XJV9tlI6VNFUVHYKXPnmzpO/BSWGPH47/y7fnRxBVslRq8b+vTCT/9k+ldE7plNsKLVq7FXpJ7hvzkxeWftbpdPeLMVkUny3bjd9357F/I17rRa3pETHhNd/5uTJiwweOIVjRy9YLfZVSinef+Jzvv/4V6vHBmjcLAR3T1fuiWvCv+c9RcPGda0S18FBg6e7C2H1/Hh7TG9eevxegv09mfrqAIsW1gDBXh6YlCK5aQSLRw1nQq/k/yqsb0e1Gbn28fGhoKAAgIKCAnx8fGyckbBnYa+/Ttjrr//X9cRK3iRiL5yv8HkvgITppBdMp9OCP6aEbPWpR9IURYSnkWea6XjkLkfqezmhjEaUUuUfBoOBJj/+WOENqbS0FL/hw+k0fHiFWGVlZWg0mvIPBwcHHBxu/m/eTz75hK+//popU6bg7HzzuyW88847vPPOO3/5PcuWLSM+Ph6dTseuXbt44YUXKny9e/fubNmy5aZjiuolMzOTgQMHVrgWHBzMvHnz2LZtG0uXLuWXX34B/rt/joyMpLCwsEr6bKXbiSp4DQy/g8bd/GEFSimO5K9g86VplBoL8Haqh0nprRK7zKhn5sk1fHtqPUZl4m7fxhQbynDXWn409XLJFSZsWMui40cASHZzx2Ay4eRomRHMnMIrnMrKoX1kA85cyuP1OSvZ9fs5XJ20Fot5PaUUk/69glOnsgEoLi7j7LlcmjQNsUr8qzQaDR+t+gfuXta/UwCQkNIGvd5IUq8oHP/qoAUL+PuQJFxdnXB0cOBIehbTXhtIcIDlFy86OTry4+OD8HS9iT1wb0G1Ka6jo6P5/PPP6d+/P6tWrWLkyJG2TknUcOFe0D7QPMf6WicKHVmeWYeno/SUlpbi7Oxcfnv8VlxbkF/9MJlMt1RcjxkzhjFjxtxy7FGjRtG/f/+//J769c23wLOzszEajQQFVZzzFhQUxKpVq245tqgegoODWbdu3X9dP3fuHM8//zyLFi0q/72Pjo5m9erVdOzYkbVr1zJo0CAaNGhwR322MuWhCt+Hkh/MF1y6o/H6BxpHy+8Okqs7w7rMjzl3ZS8OOHK3/2A6+A9D61C1b8CV2Z1zkn8d+omMK9l4auswpmkvetW72+L7diulWHTsCG9sXENuaSlh3r5M7NqdTvUbWCym3mDkha+WEN2sEcfOZ/PvhRsp1Rlo17gebwy9j9BA6wyiLV+2n99WplW49uuSvTRrFkK9etY9nSwk3DqjxX+m2wPtbBLX3e2P15Yl51dXpqoLa6hGxXX79u1xdXUlPj6eqKgoOnbsaOuURC0w/17z4sXdl8wj2IGu5oJ7/r3g5OSEVqtFp9NhNBpvaeQYKB+ttgU/Pz/8/Pxu6Weuz1WOea6dJkyYQFZWFg8//DBgvsNx//33s2DBAuLi4ujZsychISGEhITcVp+tlILSxajCd8CUAw4haLxeQ+PazZJPCwCj0rP78jx2Xp6NUekJcm1Bl+DnCHBtbPHYBforTD62jEXnzAs/7w2O4u9Ne+Pn4mnxUu3tNAAADLpJREFU2OcLC3h13WrWnD6Jo0bDqPYdGNsxGlftbWy+f5OUUrz7wxp2nzjHwYxMyvRGXJwceeHhRAYltsXxFgYZ7sSJExf5ZNJKACIjg+jarQVduragbl3r7KUsaiY5REaIm5BeAEfzoKnP7e1zfafupIit7CV+q9NC3NzcmDt3bvmiNYCnn36atLQ01q9ff9u5CbPa2IdV9pyV4TSq4J+g2wI4gNsINB5j0DhYfirIhStprM38kBzdaZwd3IkOfIKWPr1x0Fh2aoJSirVZaXx4ZCE5uiKCXL15sflDxAb+9fHKt6vMaMBkUtRxcsKkFHMP7mfi5g0U6XW0CAjkX13vo1Vdy48czlu/l4k/ri3/PNDbnS+efYSwoFv7o/9OXLlSxoTXf+auJiF0S25JWFiA1WKL6u1GfbYU10LUQjk5OeTk/PWWU/Xr16dOnToAdOrUiaioKKZPn17+9SZNmtC3b1/effddi+ZaG9TGPuza5+zlVQeKv0IVTQZ0oG2FxvtNNE4tLZ5HmbGILZemczBvCQCNPeJJCHoGD6db2x3gdlwszeeDw7+w8dJhNGjoFxrN3yLvw11rmeknSinG/baMx9vejYezMy+vWcn282dxdnRkbIdonmx3j1XmOW87msHoKT9hNFUsP2KbhzHx0Z541rH89BuA0lI9Li5auQMnbtmN+uxqMy1EiNpu9uzZzJgxg4SEBF577bVbmpt9vVudFvLcc88xbNgwOnbsSGxsLNOmTeP8+fOMGjXqtnMQ4iqV/SAYT4DGHY3HeHAbgsYKI8a/F65nY9ZnXDHm4KENJDFoDOGesRaNC2BSJn46s42px5dzxVhGhEcw/9viYVr6WHZby093pLLw2GFKDHrWnz5FmdHAPSH1mNi1OxG+1tnqL+NSHi/OWFJeWPt61CGhVWOSWkfQuVkodZwtNxXleq6u1oslahcZuRaimrh48SIODg6MGDGCAQMGEB0dzTPPPMOKFStYunQpDz74IHq9nuzsbHr16sW2bduqNP6UKVN47733uHDhAq1ateLjjz8mISGhSmPUVrWxD7v2OXuWdLDqgsUCfSbrMydxungboKGN70N0DngMZ0fL79JwsiiLdw8uIC0/A2cHLY827sbQsAS0Dpb9Y2LRscOMXbm0/HM3JyfGR8czrHVbHKw0cltUUsbwj+ZhMJpIahNBl9YRtAkPsdr8aiGqioxcC1FD1K1rXkX+1FNPsWTJElJSUigqKgLMR1JHRUVRXFzMN998w2OPPVbl8UePHs3o0aOr/HGF0PhMtcqCRZMysi/3J7Zd+hqDKiXAJYIuwc8TVMcy85uVUnx3agNDwxMpM+r5Jn0t36avx6CMtPdtzEstHiLU3fLTT3ZdOMeLq1dUuNYiIJD4ho2sVliDedT6g8d7Ex7kJ1MxRI1W44rra/+aEKKmKCwsZPjw4RQXF9OiRQvc3d1xcHCgoKCA/fv3o9FoiIiIICMjg7lz57Jw4UJ5LYhqo6DsHiizzu9rY8fuNA7u/scFHeTrLBf7fr+25a/FAYGdGBDY6Y8vGqzznhXp5sH2wY9W+jVr9hP1vc37dF/d/1yImkruxQhRDcybN4/4+HhWrlxJfn4+UVFRaLValFJ8/fXXjBw5Eg8PD3777TeioqLw8LjzE6aEEEIIceukuBaiGsjKyiIiIoL8/HxOnz5N9+7mkTelFNu2bSMhIQFPT08mT57Mo49WPkIlhBBCCMurEdNCassCIFF7PfHEEwwfPpypU6fy1ltv0ahRI8C8/3X//v3x8fEhMDAQPz8/4uLibJytEDcm/bYQoqaqEbuFCCGEEEIIYQ9q9bSQcePGER8fz9ixY60e+9SpUwQFBZGUlFR+i//9998nLi6OIUOGoNfrLRr//Pnz5UfKGwyGP43/3XffERMTQ+/evS22CKWyXLy9vUlKSiIpKan8sBNL57Jt2zZiYmKIj49n3LhxgO3apLJcbNEmAGlpaeW5PProoyilbNIuleVhqza56qOPPiq/U2Cr35WabtmyZTRr1qzCHRmDwcCwYcOIi4tj4sSJ5ddt2afbQ/yr7Kl/v5499bPXs5e+7kbstd+52brGVvnNmjWLbt26kZSUxLlz5yybm6qldu3apZ588kmllFKjRo1S27dvt2r89PR0NWTIkPLPL168qFJSUpRSSk2cOFF9//33Fo1fUlKicnJyVGJiotLr9ZXG1+l0Ki4uTun1ejVv3jz13nvvWSUXpZSKjY2t8D3WyOXChQuqpKREKaXU4MGD1YYNG2zWJtfnsn//fpu0ydU4V40cOVJt377dJu1SWR62ahOllCotLVXDhw9XsbGxNn391HQ5OTmqtLS0wv/rBQsWqLffflsppVSvXr3UhQsXbN6n2zr+teypf7+ePfWz17OXvu6v2HO/czN1ja3yO3v2rHrsscesllutHbneunUrycnJACQnJ5Oammr1HNauXUt8fDwff/wx27dvJykpyWr5uLq64uvrW/55ZfGPHTtG69at0Wq1Fs3p+lwADh8+THx8PC+//DJKKavkEhwcjKureasorVbL/v37bdYm1+fi6OhokzYBcHL64xQzFxcXjh07ZpN2uT6Phg0b2qxNAL788ktGjBgB2Pb1U9P5+vri4lLxOOxr++8uXbqwY8cOm/fpto5/LXvq369nT/3s9eylr/sr9t7v3KiusVV+K1aswGg00q1bN5599lmL51Zri+u8vDy8vLwA8+323Nxcq8YPCQnh2LFjrF27llWrVrFz506b5lNZe9iyjY4fP86GDRvIzc1l8eLFVs1l//79ZGdn4+PjY/M2uZpLixYtbNomixYtolWrVly8eBGDwWCzdrk2D39/f5u1iV6vZ/369XTt2hWwv9dPTWeP7W3r+H/FHtvLnvrZa9lLX1cZe+93bqausVV+WVlZ6HQ6Vq9ejZubm8XbrtYW1z4+PuXzaQoKCvDx8bFqfBcXF9zd3dFqtfTu3ZvIyEib5lNZe9iyjfz8zCd49enTh7S0NKvlkpOTwzPPPMNXX31l8za5NhewXZsAPPDAA6SlpVG/fn20Wq3N2uXaPJYsWWKzNvn2228ZPHhw+ee2/l2pCTIzM8vnz1/9GDhwYKXfa4/tbev4f8Xe2sue+tnr2UtfVxl773dupq6xVX7e3t4kJiYC0LVrV06dOmXR3GptcR0dHc3q1asBWLVqFZ07d7Zq/MLCwvJ/b968mcjISNavX2+zfDp06PBf8Zs0aUJaWhpGo9GqORUXF2M0GgFz20RERFglF4PBwNChQ3n//fcJDg62aZtcn4ut2gSgrKys/N9eXl4YjUabtMv1eTg7O9usTY4ePcrUqVPp0aMHBw8eZOfOnXbz+qmugoODWbduXYWPefPmVfq91/bfa9eupUOHDjbv020d/6/YU/9uT/3s9eylr/sz9t7v3ExdY6v8YmJi2L9/PwB79+6lYcOGls3tzqaIV29jxoxRcXFx6umnn7Z67F9//VW1b99eRUdHqxdffFEpZZ5UHxsbqwYNGqTKysosGl+n06lu3bopHx8f1bVrV5Wamlpp/FmzZqno6GjVs2dPlZeXZ7Vc2rVrp+Li4tTw4cOVwWCwSi5z5sxRAQEBKjExUSUmJqotW7bYrE0qy8UWbaKUUr/88otKSEhQCQkJ6vHHH1dGo9Em7XJ9Hrt27bJZm1zr6kI7W/2u1HQ7duxQ3bp1U97e3qpbt26qpKRE6XQ6NXjwYBUbG1u+sFEp2/bp9hD/Knvq369nT/3s9eylr7sZ9tjv3GxdY6v8nn/+eZWYmKj69u2rysrKLJqb7HMthBBCCCFEFam100KEEEIIIYSoalJcCyGEEEIIUUWkuBZCCCGEEKKKSHEthBBCCCFEFZHiWgghhBBCiCoixbUQQgghhBBVRIprIYQQQgghqogU10L8ibfffpuZM2cC5iNxX3jhBQDGjx/PTz/9ZMPMhBBCXE/6bGEvpLgW4k/ExsayefNmAHJzc9mzZw8AW7duJSYmxpapCSGEuI702cJeSHEtxJ/o2LEj27dv5+jRo7Rs2RKtVktBQQE5OTkEBwfbOj0hhBDXkD5b2AutrRMQwl65ubnh4uLCokWLiImJISAggM8//5x27drZOjUhhBDXkT5b2AsZuRbiL8TExDBp0iRiY2OJjY1l0qRJcntRCCHslPTZwh5IcS3EX4iNjcVgMBAREUF0dDQXLlyQjloIIeyU9NnCHmiUUsrWSQghhBBCCFETyMi1EEIIIYQQVUSKayGEEEIIIaqIFNdCCCGEEEJUESmuhRBCCCGEqCJSXAshhBBCCFFFpLgWQgghhBCiikhxLYQQQgghRBWR4loIIYQQQogq8v/1k9Ls+5JCYQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt_gradients(x_train,y_train, compute_cost, compute_gradient)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Above, the left plot shows $\\frac{\\partial J(w,b)}{\\partial w}$ or the slope of the cost curve relative to $w$ at three points. On the right side of the plot, the derivative is positive, while on the left it is negative. Due to the 'bowl shape', the derivatives will always lead gradient descent toward the bottom where the gradient is zero.\n",
    " \n",
    "The left plot has fixed $b=100$. Gradient descent will utilize both $\\frac{\\partial J(w,b)}{\\partial w}$ and $\\frac{\\partial J(w,b)}{\\partial b}$ to update parameters. The 'quiver plot' on the right provides a means of viewing the gradient of both parameters. The arrow sizes reflect the magnitude of the gradient at that point. The direction and slope of the arrow reflects the ratio of $\\frac{\\partial J(w,b)}{\\partial w}$ and $\\frac{\\partial J(w,b)}{\\partial b}$ at that point.\n",
    "Note that the gradient points *away* from the minimum. Review equation (3) above. The scaled gradient is *subtracted* from the current value of $w$ or $b$. This moves the parameter in a direction that will reduce cost."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2.5\"></a>\n",
    "###  Gradient Descent\n",
    "Now that gradients can be computed,  gradient descent, described in equation (3) above can be implemented below in `gradient_descent`. The details of the implementation are described in the comments. Below, you will utilize this function to find optimal values of $w$ and $b$ on the training data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_descent(x, y, w_in, b_in, alpha, num_iters, cost_function, gradient_function): \n",
    "    \"\"\"\n",
    "    Performs gradient descent to fit w,b. Updates w,b by taking \n",
    "    num_iters gradient steps with learning rate alpha\n",
    "    \n",
    "    Args:\n",
    "      x (ndarray (m,))  : Data, m examples \n",
    "      y (ndarray (m,))  : target values\n",
    "      w_in,b_in (scalar): initial values of model parameters  \n",
    "      alpha (float):     Learning rate\n",
    "      num_iters (int):   number of iterations to run gradient descent\n",
    "      cost_function:     function to call to produce cost\n",
    "      gradient_function: function to call to produce gradient\n",
    "      \n",
    "    Returns:\n",
    "      w (scalar): Updated value of parameter after running gradient descent\n",
    "      b (scalar): Updated value of parameter after running gradient descent\n",
    "      J_history (List): History of cost values\n",
    "      p_history (list): History of parameters [w,b] \n",
    "      \"\"\"\n",
    "    \n",
    "    # An array to store cost J and w's at each iteration primarily for graphing later\n",
    "    J_history = []\n",
    "    p_history = []\n",
    "    b = b_in\n",
    "    w = w_in\n",
    "    \n",
    "    for i in range(num_iters):\n",
    "        # Calculate the gradient and update the parameters using gradient_function\n",
    "        dj_dw, dj_db = gradient_function(x, y, w , b)     \n",
    "\n",
    "        # Update Parameters using equation (3) above\n",
    "        b = b - alpha * dj_db                            \n",
    "        w = w - alpha * dj_dw                            \n",
    "\n",
    "        # Save cost J at each iteration\n",
    "        if i<100000:      # prevent resource exhaustion \n",
    "            J_history.append( cost_function(x, y, w , b))\n",
    "            p_history.append([w,b])\n",
    "        # Print cost every at intervals 10 times or as many iterations if < 10\n",
    "        if i% math.ceil(num_iters/10) == 0:\n",
    "            print(f\"Iteration {i:4}: Cost {J_history[-1]:0.2e} \",\n",
    "                  f\"dj_dw: {dj_dw: 0.3e}, dj_db: {dj_db: 0.3e}  \",\n",
    "                  f\"w: {w: 0.3e}, b:{b: 0.5e}\")\n",
    " \n",
    "    return w, b, J_history, p_history #return w and J,w history for graphing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration    0: Cost 7.93e+04  dj_dw: -6.500e+02, dj_db: -4.000e+02   w:  6.500e+00, b: 4.00000e+00\n",
      "Iteration 1000: Cost 3.41e+00  dj_dw: -3.712e-01, dj_db:  6.007e-01   w:  1.949e+02, b: 1.08228e+02\n",
      "Iteration 2000: Cost 7.93e-01  dj_dw: -1.789e-01, dj_db:  2.895e-01   w:  1.975e+02, b: 1.03966e+02\n",
      "Iteration 3000: Cost 1.84e-01  dj_dw: -8.625e-02, dj_db:  1.396e-01   w:  1.988e+02, b: 1.01912e+02\n",
      "Iteration 4000: Cost 4.28e-02  dj_dw: -4.158e-02, dj_db:  6.727e-02   w:  1.994e+02, b: 1.00922e+02\n",
      "Iteration 5000: Cost 9.95e-03  dj_dw: -2.004e-02, dj_db:  3.243e-02   w:  1.997e+02, b: 1.00444e+02\n",
      "Iteration 6000: Cost 2.31e-03  dj_dw: -9.660e-03, dj_db:  1.563e-02   w:  1.999e+02, b: 1.00214e+02\n",
      "Iteration 7000: Cost 5.37e-04  dj_dw: -4.657e-03, dj_db:  7.535e-03   w:  1.999e+02, b: 1.00103e+02\n",
      "Iteration 8000: Cost 1.25e-04  dj_dw: -2.245e-03, dj_db:  3.632e-03   w:  2.000e+02, b: 1.00050e+02\n",
      "Iteration 9000: Cost 2.90e-05  dj_dw: -1.082e-03, dj_db:  1.751e-03   w:  2.000e+02, b: 1.00024e+02\n",
      "(w,b) found by gradient descent: (199.9929,100.0116)\n"
     ]
    }
   ],
   "source": [
    "# initialize parameters\n",
    "w_init = 0\n",
    "b_init = 0\n",
    "# some gradient descent settings\n",
    "iterations = 10000\n",
    "tmp_alpha = 1.0e-2\n",
    "# run gradient descent\n",
    "w_final, b_final, J_hist, p_hist = gradient_descent(x_train ,y_train, w_init, b_init, tmp_alpha, \n",
    "                                                    iterations, compute_cost, compute_gradient)\n",
    "print(f\"(w,b) found by gradient descent: ({w_final:8.4f},{b_final:8.4f})\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img align=\"left\" src=\"./images/C1_W1_Lab03_lecture_learningrate.PNG\"  style=\"width:340px; padding: 15px; \" > \n",
    "Take a moment and note some characteristics of the gradient descent process printed above.  \n",
    "\n",
    "- The cost starts large and rapidly declines as described in the slide from the lecture.\n",
    "- The partial derivatives, `dj_dw`, and `dj_db` also get smaller, rapidly at first and then more slowly. As shown in the diagram from the lecture, as the process nears the 'bottom of the bowl' progress is slower due to the smaller value of the derivative at that point.\n",
    "- progress slows though the learning rate, alpha, remains fixed"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Cost versus iterations of gradient descent \n",
    "A plot of cost versus iterations is a useful measure of progress in gradient descent. Cost should always decrease in successful runs. The change in cost is so rapid initially, it is useful to plot the initial decent on a different scale than the final descent. In the plots below, note the scale of cost on the axes and the iteration step."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2gAAAEoCAYAAAAt0dJ4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeXhU5d3/8Xc2spFkEnZiggsgIglWxZBNAibiwlIVKzUi9an4qBVFLfJ7irEgtKRS7WIpYLWKFlDcQKxFDDtKCCAQIyoqIsYgJCYhAUKWyfn9MWWSMwl7Jmcm+byuqxdzf88snwQv7n7n3Oc+PoZhGIiIiIiIiIjlfK0OICIiIiIiIg5q0ERERERERDyEGjQREREREREPoQZNRERERETEQ6hBExERERER8RBq0ERERERERDyEGjTxes899xwDBgwgNDSUXr16cffdd1NUVHTW73f++eeTm5vbgglPbuHChdx0000A7N27l6CgILd91rRp07j33ntNtUsvvZQtW7ac83sfPnyY/v37c/To0ZM+Ly0tjVdfffWsP2ft2rX069fPVPvFL37B8uXLz/o9RURam+au0+fOucvVq6++yv3339/i73vvvfcybdo0AF566SUeffTRFv8MaTvUoIlXmzlzJtOnT+fpp5+mtLSUgoICBg4cyMaNG62OdtoyMzN5++23W+S96urqzvg1n376KYMGDTrnz54zZw633HILISEh5/xeJ1JbW9ts/dFHH+XJJ5902+eKiLQkzV1mVs5drmbMmMEjjzzS4u/bWGZmJm+99RYlJSVu/RzxYoaIlyorKzOCg4ONZcuWnfA5O3fuNBITE42IiAgjMTHR2Llzp2EYhmG3243777/f6NSpkxEeHm4kJCQYNTU1xi9/+UvDx8fHCA4ONkJDQ4033njD9H7r1683+vTpY6r9+te/Nh599FHDMAxj+vTpRrdu3YywsDBj4MCBRlFR0Sl/jhdffNEYPny4YRiG0adPHwMwQkNDjdDQUOPAgQNGXV2d8cQTTxixsbFGt27djEceecSora01DMMwfvvb3xq333678dOf/tQICQkxNmzYYCxbtswYMGCA0bFjR6Nv377G22+/bRiGYaxZs8YICAgw/P39jdDQUOOnP/2pYRiG0atXL2PTpk2GYRjGjz/+aNx6661GVFSU0adPH+O1115z5hwyZIgxffp044orrjDCw8ONsWPHGtXV1c7jffr0MT799FPnuLnfxZNPPmn4+voagYGBRmhoqPH0008bdrvduOmmm4wuXboYkZGRxtixY43y8nLDMAzjm2++MQIDA42//e1vRo8ePYy7777bCAoKMnx8fIzQ0FCjU6dOzs+75JJLnH+/IiKeSnOXZ81djX344YfGoEGDTLW1a9cal19+uREREWEMGTLE+OqrrwzDaJifnnvuOaN79+5G9+7djVdeecX5uh9++MHIyMgwOnbsaNx4443G7bffbvz2t791Hr/vvvuMv/zlL6f8PUv7pAZNvNZ7771n+Pv7G3V1dc0er66uNnr16mXMnz/fqKmpMf7+978bvXr1Mqqrq43//Oc/xpVXXmlUVFQYdXV1xqZNm5zv0/gffVf19fVGz549je3btztr559/vrF582bjs88+M2JiYowDBw4Ydrvd2Llzp7PROJnGk9zxf/Abe+qpp4z09HSjuLjYKC8vN9LS0oy//vWvhmE4JrnAwEBj5cqVht1uN44dO2asWbPG+Pzzzw273W4sXbrU6Nixo1FcXOx8/v/+7/+a3r/xzzt27Fhj/PjxRlVVlZGbm2uEh4cbu3btMgzDMckNGDDA+Pbbb42ysjKjf//+xssvv2wYhmHs2bPHiIqKcr7nyX4XQ4YMMRYvXux8rt1uN1555RXjyJEjRmlpqTF06FBjypQpzt+Hj4+Pce+99xpVVVXG0aNHjTVr1hgXX3xxk9/jPffcYzz11FOn/H2LiFhJc5fnzF2unnjiCeORRx5xjvft22d06dLF2LBhg1FXV2c8++yzxhVXXGHU19c756dHH33UqK6uNt5//30jLCzMOHLkiGEYhnHLLbcYd999t1FVVWX85z//MTp06GBq0BYtWmTccMMNp/w9S/ukJY7itX788Uc6d+6Mn59fs8dzc3Px9/fnnnvuISAggPvuuw8/Pz9yc3MJCAigsrKS3bt34+vry+DBg0/4Po35+PgwZswYlixZAsDmzZsBuOqqq/D396e6uprPPvsMwzCIj48nIiLinH/OF154gd/97nd07tyZiIgIHn30Ud544w3n8WHDhpGRkYGvry+BgYGkpaVx8cUX4+vry+jRo+nduzc7duw45efY7XbefPNNZs6cSVBQEAkJCdxyyy28/vrrzudMmDCB2NhYbDYbN954Izt37gQcS0369OnjfN6Z/C58fX254447CAkJITIykoceesi0zMcwDKZPn05QUBDBwcEnzN+vXz/y8/NP+XOKiFhJc5eDJ8xdrlznsoULFzJmzBhSUlLw8/PjgQce4Ntvv2Xv3r2AY37KysqiQ4cOXHvttQQFBbFnzx7q6upYtmwZ06ZNIygoiOuuu46UlBTTZ2nOkpNRgyZeq1OnTpSUlGC325s9XlRURExMjKkWGxvL/v37ueaaa5gwYQLjx48nOjraeeHu6bjtttuc//AvWbKEn/3sZwD07t2bp556ismTJ9OtWzcefPBBqqurz+6Ha2Tfvn1kZGRgs9mw2WxkZmZSXFzsPO76M27cuJGkpCSioqKw2Wx88skn/Pjjj6f8nOLiYux2O9HR0c5ar1692L9/v3PctWtX5+OQkBAOHz4MwKFDh+jYsaPz2Jn8Lurq6pg0aRK9evUiPDyczMxMU94OHTqYPvdEwsLCOHTo0CmfJyJiJc1dDp4wd7lyncv27dvHiy++6PwZbDYbR44ccW7mEhgYaGpmj793SUkJ9fX19OzZ03ksNjbW9Fmas+Rk1KCJ10pMTMTf35/33nuv2eM9e/aksLDQVNu3bx89evQAHBtLFBQUsH79el544QU++OADwPFN46k+t7q6mo8//pg33njDOckBjB8/nry8PD755BM2btzIyy+/fEY/U3OfHR0dzfr16ykvL6e8vJxDhw6xa9euE75m3Lhx/PKXv+TAgQOUl5cTFxeHYRin/Nm6dOmCr68v33//vbPW+Pd1MhEREU0mvBP9LlwzLFy4kA0bNrBp0yYqKipYuHChM29zzz/Rz1BZWdki3/qKiLiT5q7mX2PF3OXKdS6Ljo7m3nvvdf4M5eXlHD16lOTk5JO+T+fOnfHx8TE1id99953pOZqz5GTUoInXstlsTJ06lfvvv58PPviAmpoajhw5wty5c1myZAmDBw+mpqaG559/nrq6OubPn09dXR2DBw9m69atbNu2DbvdTnh4OP7+/s5lIl27dmXPnj0n/NzjS0UmT55MQEAAV1xxBQBffPEF69evp6amho4dOxIYGHhaS08a69y5MzU1Naatlu+66y7+7//+j/3792MYBnv37mXdunUnfI/Kykrn8pnFixdTUFDgPNa1a1e++eYbUwN0nJ+fHzfffDNPPPEEx44dIy8vjzfffJMxY8acMndcXBxfffWVc3yy34Xr77eyspKgoCAiIyM5ePAgzzzzzEk/q2vXrhw4cKDJdv5ffPEFcXFxp8wqImIlzV3Ns2LuchUXF8eXX37pHP/85z/ntddeY/369dTX11NZWWlapnki/v7+jBo1iunTp1NdXc0HH3zAhg0bTM/RnCUnowZNvNrjjz/O448/zqRJk4iMjOSSSy5h+/btpKam0qFDB5YtW8bzzz9Pp06dePHFF1m2bBkdOnTg0KFDjB8/noiICOLj4/n5z3/OsGHDAPj1r3/N5MmTsdlsvPXWW81+7m233cbq1au59dZbnbXq6moeeeQROnXqxAUXXMCAAQMYN24c4Lj/ies9XJoTGhrK5MmTiY+Px2azcfDgQR577DESExNJTk4mIiKCkSNHNvkmrrFnn32W++67j06dOvHhhx+SmJjoPHbzzTdTXl5OZGRks5PXnDlzqKiooGfPnmRmZjJ37lz69+9/yty9evWic+fOfPbZZ6f8XfzqV7/i+eefx2az8ec//5k777yTsLAwunTpwtChQ7nxxhtP+lmXXHIJN9xwA+eddx7du3d31jds2MDw4cNPmVVExGqau5qyYu5yNXz4cNM10BdeeCGLFy/mscceIyoqin79+rF06dLTeq85c+bw9ddf07lzZ/785z83ya05S07Gx2ju6wgRkTM0e/ZsKisrLbkfWUFBAePHj2fbtm2t/tkiItJ2DBgwgGXLlnHRRRe57TPq6uro06cPeXl5dOnSxW2fI95LZ9BEpEXcd999vPnmm02WHraGp59+mt/+9ret/rkiItK2ZGVl8fTTT7v1MxYuXMhNN92k5kxOSGfQREREREREPITOoImIiIiIiHgINWgiIiIiIiIewt/qAC1BN/oTERHAa+4rpHlLRESg+XlLZ9BEREREREQ8hBo0ERERERERD9Emljg25i3LW0REpGVYuVywoKCAe+65Bz8/P3r37s0///lPfHx8AJg2bRpvv/02kZGRjBo1ikceeaTZ99C8JSLSvpxq3mpzDZqIiEhrufjii/noo48AuOuuu9i6dSuDBg1yHn/66adJT0+3Kp6IiHghLXEUERE5SwEBAc7HgYGBxMTEmI5PmTKF9PR0duzY0drRRETES6lBExEROQfvvPMOAwYM4ODBg3Tq1MlZf/DBB9m2bRtz585l4sSJ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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot cost versus iteration  \n",
    "fig, (ax1, ax2) = plt.subplots(1, 2, constrained_layout=True, figsize=(12,4))\n",
    "ax1.plot(J_hist[:100])\n",
    "ax2.plot(1000 + np.arange(len(J_hist[1000:])), J_hist[1000:])\n",
    "ax1.set_title(\"Cost vs. iteration(start)\");  ax2.set_title(\"Cost vs. iteration (end)\")\n",
    "ax1.set_ylabel('Cost')            ;  ax2.set_ylabel('Cost') \n",
    "ax1.set_xlabel('iteration step')  ;  ax2.set_xlabel('iteration step') \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Predictions\n",
    "Now that you have discovered the optimal values for the parameters $w$ and $b$, you can now use the model to predict housing values based on our learned parameters. As expected, the predicted values are nearly the same as the training values for the same housing. Further, the value not in the prediction is in line with the expected value."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000 sqft house prediction 300.0 Thousand dollars\n",
      "1200 sqft house prediction 340.0 Thousand dollars\n",
      "2000 sqft house prediction 500.0 Thousand dollars\n"
     ]
    }
   ],
   "source": [
    "print(f\"1000 sqft house prediction {w_final*1.0 + b_final:0.1f} Thousand dollars\")\n",
    "print(f\"1200 sqft house prediction {w_final*1.2 + b_final:0.1f} Thousand dollars\")\n",
    "print(f\"2000 sqft house prediction {w_final*2.0 + b_final:0.1f} Thousand dollars\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2.6\"></a>\n",
    "## Plotting\n",
    "You can show the progress of gradient descent during its execution by plotting the cost over iterations on a contour plot of the cost(w,b). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig, ax = plt.subplots(1,1, figsize=(12, 6))\n",
    "plt_contour_wgrad(x_train, y_train, p_hist, ax)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Above, the contour plot shows the $cost(w,b)$ over a range of $w$ and $b$. Cost levels are represented by the rings. Overlayed, using red arrows, is the path of gradient descent. Here are some things to note:\n",
    "- The path makes steady (monotonic) progress toward its goal.\n",
    "- initial steps are much larger than the steps near the goal."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Zooming in**, we can see that final steps of gradient descent. Note the distance between steps shrinks as the gradient approaches zero."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "fig, ax = plt.subplots(1,1, figsize=(12, 4))\n",
    "plt_contour_wgrad(x_train, y_train, p_hist, ax, w_range=[180, 220, 0.5], b_range=[80, 120, 0.5],\n",
    "            contours=[1,5,10,20],resolution=0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a name=\"toc_40291_2.7.1\"></a>\n",
    "### Increased Learning Rate\n",
    "\n",
    "<figure>\n",
    " <img align=\"left\", src=\"./images/C1_W1_Lab03_alpha_too_big.PNG\"   style=\"width:340px;height:240px;\" >\n",
    "</figure>\n",
    "In the lecture, there was a discussion related to the proper value of the learning rate, $\\alpha$ in equation(3). The larger $\\alpha$ is, the faster gradient descent will converge to a solution. But, if it is too large, gradient descent will diverge. Above you have an example of a solution which converges nicely.\n",
    "\n",
    "Let's try increasing the value of  $\\alpha$ and see what happens:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# initialize parameters\n",
    "w_init = 0\n",
    "b_init = 0\n",
    "# set alpha to a large value\n",
    "iterations = 10\n",
    "tmp_alpha = 8.0e-1\n",
    "# run gradient descent\n",
    "w_final, b_final, J_hist, p_hist = gradient_descent(x_train ,y_train, w_init, b_init, tmp_alpha, \n",
    "                                                    iterations, compute_cost, compute_gradient)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Above, $w$ and $b$ are bouncing back and forth between positive and negative with the absolute value increasing with each iteration. Further, each iteration $\\frac{\\partial J(w,b)}{\\partial w}$ changes sign and cost is increasing rather than decreasing. This is a clear sign that the *learning rate is too large* and the solution is diverging. \n",
    "Let's visualize this with a plot."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt_divergence(p_hist, J_hist,x_train, y_train)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Above, the left graph shows $w$'s progression over the first few steps of gradient descent. $w$ oscillates from positive to negative and cost grows rapidly. Gradient Descent is operating on both $w$ and $b$ simultaneously, so one needs the 3-D plot on the right for the complete picture."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "## Congratulations!\n",
    "In this lab you:\n",
    "- delved into the details of gradient descent for a single variable.\n",
    "- developed a routine to compute the gradient\n",
    "- visualized what the gradient is\n",
    "- completed a gradient descent routine\n",
    "- utilized gradient descent to find parameters\n",
    "- examined the impact of sizing the learning rate"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "dl_toc_settings": {
   "rndtag": "40291"
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "toc-autonumbering": false
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
